Lệnh git revert sẽ hoàn tác commit để bạn có thể trả kho về commit trước. Thay vì xóa commit, revert sẽ tạo commit mới đảo ngược thay đổi của commit đã xuất bản. Điều này bảo toàn commit ban đầu như phần của lịch sử dự án.
Khi bạn làm việc với kho Git, bạn có thể vô tình tạo commit với mã chưa sẵn sàng lưu trong kho Git.
Đó là nơi lệnh git revert xuất hiện. Lệnh git revert cho phép bạn undo (hoàn tác) commit để trả kho về commit trước.
Hướng dẫn này sẽ thảo luận, với ví dụ, hoàn tác mã và cách dùng lệnh git revert để hoàn tác mã. Sau khi đọc hướng dẫn này, bạn sẽ thành thạo hoàn tác mã dùng lệnh git revert commit.
Hoàn tác Mã (Reverting Your Code)
Đôi khi, khi làm việc với kho Git, bạn có thể nhận ra bạn đã làm sai lầm trong commit.
Ví dụ, giả sử bạn vừa hoàn thành tính năng mới, và nhận ra có lỗi cần sửa. Khi commit sửa lỗi, bạn cũng nhận ra đã commit thư mục làm việc cho tính năng mới đang phát triển.
Điều này có nghĩa commit bao gồm cả sửa lỗi và tính năng mới, có thể gây nhầm lẫn cho cộng tác viên khác. Thay vì commit cả hai thay đổi cùng lúc, bạn muốn đưa vào hai commit riêng.
Trong tình huống này, bạn có thể muốn hoàn tác kho về trạng thái trước khi đẩy commit. Điều này cho bạn cơ hội khác đẩy commit bằng cách revert commit cuối.
Lệnh Git Revert
Lệnh git revert cho phép bạn undo commit. Tuy nhiên, thay vì xóa commit khỏi dự án, lệnh git revert tìm thay đổi giữa hai commit cuối và tạo commit mới đảo ngược những thay đổi đó.
Lệnh git revert hữu ích vì nó cho phép bảo toàn lịch sử dự án của kho. Thay vì xóa commit hoàn toàn, nó cho phép hoàn tác kho về commit khác, để bạn vẫn giữ bản ghi chính xác mọi commit đã đẩy lên kho.
Bạn nên dùng lệnh git revert khi muốn đảo ngược commit cuối. Thay vì thủ công làm thay đổi cần thiết cho commit cuối, bạn có thể revert commit và đẩy commit mới lên codebase.
Cú pháp cho lệnh git revert như sau:
git revert
Hãy đi qua ví dụ để minh họa cách lệnh này hoạt động.
Ví dụ Git Revert
Trên máy cục bộ, chúng ta có kho ví dụ với một file: README.md. Chúng ta vừa làm thay đổi cho file muốn đẩy lên commit. Chúng ta có thể làm như sau:
git commit -m "docs: Update README.md with author info"
Lệnh này, khi thực thi, tạo commit với thông điệp docs: Update README.md with author info. Chúng ta cũng vừa làm thay đổi khác cho README.md, commit vào repo dùng lệnh:
git commit -m "docs: Update order of authors by contributions"
Lệnh này tạo commit khác trong kho. Nếu dùng lệnh git log --pretty=oneline (cho danh sách commit ngắn), thấy 2 commit trong lịch sử:
6f52d877873e7d3b52c929647384dfdf2488da22 (HEAD -> master) docs: Update order of authors by contributions 57d763663e619088159bb7629243456f88feab79 docs: Update README.md with author info
Bây giờ, giả sử quyết định revert commit cuối. Chúng ta nhận ra thứ tự tác giả trong README.md sai, cần revert kho về trạng thái trước khi đẩy commit cuối.
Chúng ta có thể làm như sau:
git revert HEAD
Khi chạy lệnh, trình soạn thảo mặc định mở và nhờ tạo thông điệp cho commit. Trong lệnh này, HEAD tham chiếu đến commit mới nhất. Trong ví dụ, gõ thông điệp revert author order commit. Lệnh trả về:
[master b66c29a] revert author order commit "docs: Update order of authors by contributions" 1 file changed, 1 deletion(-)
Bây giờ, khi chạy git log --pretty=oneline, thấy commit mới được tạo:
b66c29a8c4c226fa9ae8cd8f9e086c0a73e6ecfe (HEAD -> master) revert author order commit "docs: Update order of authors by contributions" 6f52d877873e7d3b52c929647384dfdf2488da22 docs: Update order of authors by contributions 57d763663e619088159bb7629243456f88feab79 docs: Update README.md with author info
Lịch sử commit giờ liệt kê ba commit. Thay vì xóa commit cuối, git revert tạo commit mới hoàn tác thay đổi của commit trước. Điều này có nghĩa chúng ta vẫn có lịch sử hoàn chỉnh tất cả commit đẩy lên kho.
Lệnh git revert cần tham chiếu commit để thực thi. Trong trường hợp này, chỉ định HEAD, revert kho về commit cuối.
Nếu muốn revert về commit khác, có thể chỉ định giá trị hash cho commit đó. Vì vậy, thay vì nói HEAD trong lệnh, có thể dùng hash từ git log để revert về commit chọn. Đây là ví dụ lệnh revert kho về commit cụ thể:
git revert 57d763663e619088159bb7629243456f88feab79
Lệnh này revert kho về commit với SHA hash 57d763663e619088159bb7629243456f88feab79. Trong kho này, hash đó tương ứng với commit đầu tiên chúng ta làm.
Git Revert vs. Reset
Lệnh revert và reset đều dùng để hoàn tác thay đổi từ commit trước trong kho Git. Tuy nhiên, bạn nên biết các lệnh này có hành vi hơi khác.
Thao tác dòng lệnh git revert dùng để hoàn tác commit trước. Khi chạy git revert, thay đổi giữa hai commit được hoàn tác. Sau đó, commit mới được tạo chứa mã trong repo sau khi thay đổi được hoàn tác.
Lệnh git reset, mặt khác, revert kho về trạng thái trước bằng cách xóa tất cả commit giữa phạm vi nhất định. Vì vậy, nếu chạy git reset và tham chiếu commit trước, tất cả commit giữa trạng thái hiện tại kho và commit đó sẽ bị xóa.
Revert commit thường ưu tiên hơn reset commit. Lý do chính vì git revert không thay đổi lịch sử dự án. Điều này cho phép bạn, nhà phát triển, duy trì bản ghi chính xác mọi thay đổi làm cho dự án.
Ngoài ra, git revert cho phép revert về commit riêng lẻ tại điểm nhất định trong lịch sử kho. Lệnh git reset, mặt khác, chỉ làm việc ngược từ commit bạn đang ở.
Điều này có nghĩa, nếu muốn hoàn tác commit xa trong lịch sử kho, bạn phải xóa tất cả commit trước điểm đó, rồi commit thay đổi. Điều này làm khó khăn việc giữ bản ghi lịch sử chính xác của kho, phần quan trọng để dùng hiệu quả công cụ kiểm soát nguồn như Git.
Kết luận
Lệnh git revert cho phép hoàn tác thay đổi bạn làm cho kho mã từ commit cụ thể. Thay vì xóa commit, git revert xác định thay đổi giữa commit hiện tại và commit trước và tạo commit mới để revert những thay đổi.
Hướng dẫn này thảo luận cách dùng lệnh git revert để revert commit trong Git. Bây giờ bạn sẵn sàng bắt đầu revert commit dùng lệnh git revert commit như nhà phát triển chuyên nghiệp!