Git là công cụ quản lý mã nguồn phổ biến và mạnh mẽ, giúp các lập trình viên theo dõi và kiểm soát sự phát triển của dự án. Trong số các lệnh Git, git reset
, git revert
, và git rebase
là những công cụ quan trọng để chỉnh sửa và quản lý lịch sử commit. Mỗi lệnh có cách hoạt động riêng, từ việc quay lại trạng thái trước đó, đảo ngược một commit, đến việc làm gọn lịch sử phát triển của nhánh. Hiểu rõ cách sử dụng các lệnh này sẽ giúp bạn làm việc với Git hiệu quả và tối ưu hơn trong các dự án.
1. GIT RESET
a. Định nghĩa
git reset
là một lệnh trong Git dùng để di chuyển HEAD
của bạn trở lại một commit trước đó và có thể thay đổi trạng thái của các tệp trong staging area và working directory. git reset
thường được sử dụng để “làm lại” các thay đổi bằng cách xóa hoặc quay lại một commit trước đó mà không tạo ra commit mới.
git reset
có ba chế độ chính:
- –soft: Di chuyển
HEAD
nhưng giữ lại các thay đổi trong staging area.
- –mixed: Di chuyển
HEAD
và xóa các thay đổi khỏi staging area nhưng giữ lại trong working directory (mặc định).
- –hard: Di chuyển
HEAD
và xóa hoàn toàn các thay đổi trong cả staging area và working directory.
b. Cú pháp
git reset [] [--soft | --mixed | --hard]
- <commit>: Là commit mà bạn muốn quay lại. Nếu không chỉ định commit, Git sẽ chọn commit hiện tại.
- –soft: Giữ nguyên staging area và working directory.
- –mixed: (Mặc định) Giữ nguyên working directory nhưng xóa các thay đổi khỏi staging area.
- –hard: Xóa tất cả các thay đổi khỏi staging area và working directory.
c. Ví dụ
- git reset –soft HEAD~1
- Di chuyển
HEAD
về commit trước (HEAD~1), nhưng vẫn giữ lại các thay đổi trong staging area và working directory.
- git reset –mixed HEAD~1
- Di chuyển
HEAD
về commit trước (HEAD~1) và xóa các thay đổi trong staging area, nhưng giữ nguyên trong working directory.
- git reset –hard HEAD~1
- Di chuyển
HEAD
về commit trước (HEAD~1) và xóa mọi thay đổi khỏi cả staging area và working directory.
2. GIT REVERT
a. Định nghĩa
git revert
là lệnh được sử dụng để tạo ra một commit mới nhằm đảo ngược những thay đổi của một commit trước đó, mà không thay đổi lịch sử commit. Điều này đảm bảo rằng các commit bị đảo ngược vẫn tồn tại trong lịch sử, giúp duy trì tính minh bạch của repository.
Khác với git reset
xóa hoặc thay đổi lịch sử commit, git revert
tạo ra một commit mới để ghi lại việc đảo ngược thay đổi.
b. Cú pháp
- <commit>: Là commit bạn muốn đảo ngược.
c. Ví dụ
- git revert HEAD
- Tạo ra một commit mới để đảo ngược các thay đổi từ commit mới nhất (HEAD).
- git revert abc123
- Đảo ngược commit có hash
abc123
. Git sẽ tạo ra một commit mới để ghi lại sự đảo ngược này.
- git revert HEAD~2
- Đảo ngược các thay đổi của commit trước commit hiện tại (HEAD~2).
3. GIT REBASE
a. Định nghĩa
git rebase
là lệnh dùng để tích hợp các thay đổi từ một nhánh khác vào nhánh hiện tại bằng cách di chuyển các commit của nhánh hiện tại lên trên commit của nhánh khác, tạo ra một lịch sử commit tuyến tính. Điều này giúp làm cho lịch sử commit của repository dễ theo dõi hơn so với việc dùng git merge
.
Có hai loại rebase chính:
- Interactive rebase: Cho phép chỉnh sửa, sắp xếp lại, hoặc xóa commit trong quá trình rebase.
- Non-interactive rebase: Tự động di chuyển commit mà không yêu cầu tương tác.
b. Cú pháp
- <branch>: Là nhánh mà bạn muốn di chuyển commit của mình lên trên nó.
- -i: Tùy chọn này kích hoạt chế độ interactive, cho phép bạn chỉnh sửa lịch sử commit.
c. Cách hoạt động
Khi bạn thực hiện lệnh git rebase <branch>
, Git sẽ:
- Xác định các commit trên nhánh hiện tại mà không tồn tại trên nhánh mục tiêu (ví dụ: nhánh mà bạn đang rebase).
- “Bắt” các commit đó và “di chuyển” chúng lên đầu nhánh mục tiêu.
- Nếu có xung đột xảy ra trong quá trình rebase, Git sẽ tạm dừng quá trình và yêu cầu bạn giải quyết xung đột trước khi tiếp tục.
d. Ví dụ
- git rebase main
- Di chuyển các commit trên nhánh hiện tại lên trên các commit của nhánh
main
.
- git rebase -i HEAD~3
- Bắt đầu một interactive rebase cho ba commit cuối cùng. Bạn có thể thay đổi thứ tự, hợp nhất, hoặc xóa commit.
- git rebase –continue
- Sau khi giải quyết xung đột trong quá trình rebase, dùng lệnh này để tiếp tục quá trình.
- git rebase –abort
- Hủy bỏ quá trình rebase và quay lại trạng thái trước khi rebase.
So sánh các lệnh:
- git reset: Thay đổi trạng thái và lịch sử của commit, có thể phá vỡ lịch sử commit nếu không cẩn thận.
- git revert: Đảo ngược một commit mà không phá vỡ lịch sử commit.
- git rebase: Tạo một lịch sử commit tuyến tính hơn bằng cách di chuyển commit từ nhánh này sang nhánh khác.
Mỗi lệnh có ưu và nhược điểm riêng, và tùy thuộc vào tình huống mà bạn chọn lệnh nào phù hợp nhất.
Kết luận
git reset
, git revert
, và git rebase
là ba lệnh quan trọng trong Git, mỗi lệnh mang một cách tiếp cận khác nhau trong việc quản lý và chỉnh sửa lịch sử commit.
-
git reset
giúp bạn quay lại trạng thái trước đó bằng cách thay đổi lịch sử commit trực tiếp. Đây là lựa chọn tốt khi bạn muốn làm lại các thay đổi một cách đơn giản, nhưng cần cẩn trọng vì nó có thể làm mất dữ liệu chưa commit.
-
git revert
lại an toàn hơn, vì nó tạo ra một commit mới để đảo ngược những thay đổi trước đó, mà không thay đổi lịch sử commit, giúp giữ lại toàn bộ quá trình phát triển.
-
git rebase
là lựa chọn khi bạn muốn giữ lịch sử commit sạch sẽ và tuyến tính, đặc biệt hữu ích khi làm việc với nhiều nhánh, giúp việc hợp nhất (merge) trở nên dễ dàng và gọn gàng hơn.
Sử dụng đúng các lệnh này không chỉ giúp bạn quản lý mã nguồn hiệu quả mà còn giúp tránh những sai lầm nghiêm trọng có thể xảy ra khi làm việc trong môi trường cộng tác.