Khi duy trì code bằng các hệ thống kiểm soát phiên bản như git, việc chúng ta cần phải rollback một số commit sai do lỗi hoặc hoàn tác code tạm thời là điều không thể tránh khỏi. Trong trường hợp này, các nhà phát triển mới vào nghề sẽ rất lo lắng vì họ có thể không biết phải làm gì để rollback các thay đổi của mình mà không ảnh hưởng đến người khác, nhưng đối với các nhà phát triển kỳ cựu, đây là công việc thường ngày của họ và họ có thể chỉ cho bạn nhiều cách khác nhau để thực hiện điều đó.
Trong bài viết này, chúng ta sẽ giới thiệu hai cách chính được các nhà phát triển sử dụng thường xuyên.
- git reset
- git revert
Sự khác biệt và các trường hợp sử dụng tương ứng của chúng là gì? Chúng ta sẽ thảo luận chi tiết về chúng dưới đây.
git reset
Giả sử chúng ta có một vài commit bên dưới.
Commit A và B là các commit hoạt động, nhưng commit C và D là các commit xấu. Bây giờ chúng ta muốn rollback về commit B và loại bỏ commit C và D. Hiện tại HEAD đang trỏ đến commit D 5lk4er, chúng ta chỉ cần trỏ HEAD đến commit B a0fvf8 để đạt được điều chúng ta muốn.
Rất dễ dàng để sử dụng lệnh git reset.
git reset --hard a0fvf8
Sau khi thực thi lệnh trên, HEAD sẽ trỏ đến commit B.
Nhưng bây giờ remote origin vẫn có HEAD trỏ đến commit D, nếu chúng ta trực tiếp sử dụng git push để đẩy các thay đổi, nó sẽ không cập nhật repo từ xa, chúng ta cần thêm tùy chọn -f để buộc đẩy các thay đổi.
git push -f
Nhược điểm của phương pháp này là tất cả các commit sau HEAD sẽ biến mất sau khi reset xong. Trong trường hợp một ngày nào đó chúng ta phát hiện ra rằng một số commit là tốt và muốn giữ lại chúng thì đã quá muộn. Vì điều này, nhiều công ty cấm sử dụng phương pháp này để rollback các thay đổi.
git revert
Việc sử dụng git revert là để tạo một commit mới, commit này sẽ hoàn tác một commit trước đó. HEAD sẽ trỏ đến commit hoàn tác mới.
Đối với ví dụ về git reset ở trên, những gì chúng ta cần làm chỉ là hoàn tác commit D và sau đó hoàn tác commit C.
git revert 5lk4er
git revert 76sdeb
Bây giờ nó tạo ra hai commit mới D' và C',
Trong ví dụ trên, chúng ta chỉ có hai commit để hoàn tác, vì vậy chúng ta có thể hoàn tác từng commit một. Nhưng nếu có rất nhiều commit cần hoàn tác thì sao? Chúng ta có thể hoàn tác một phạm vi.
git revert OLDER_COMMIT^..NEWER_COMMIT
Phương pháp này sẽ không có nhược điểm của git reset, nó sẽ trỏ HEAD đến commit hoàn tác mới được tạo và có thể trực tiếp đẩy các thay đổi lên remote mà không cần sử dụng tùy chọn -f.
Bây giờ chúng ta hãy xem một ví dụ khó hơn. Giả sử chúng ta có ba commit nhưng commit xấu là commit thứ hai.
Không nên sử dụng git reset để rollback commit B vì chúng ta cần giữ lại commit C vì nó là một commit tốt. Bây giờ chúng ta có thể hoàn tác commit C và B và sau đó sử dụng cherry-pick để commit lại C.
Từ giải thích trên, chúng ta có thể thấy rằng sự khác biệt lớn nhất giữa git reset và git revert là git reset sẽ reset trạng thái của branch về trạng thái trước đó bằng cách loại bỏ tất cả các thay đổi sau commit mong muốn, trong khi git revert sẽ reset về trạng thái trước đó bằng cách tạo các commit hoàn tác mới và giữ lại các commit ban đầu. Nên sử dụng git revert thay vì git reset trong môi trường doanh nghiệp.
Tham khảo: https://kknews.cc/news/4najez2.html
Really hard to take anything you say seriously when you use the entire aplhabet for your hexadecimal SHA1 examples.