Cách đơn giản nhất để hoàn tác một cam kết cụ thể đó là:
- không phải trong đầu hoặc đầu
- Đã bị đẩy ra xa.
Bởi vì nếu đó không phải là cam kết mới nhất,
git reset HEAD
không hoạt động. Và bởi vì nó đã được đẩy đến một điều khiển từ xa,
git rebase -i
và
git rebase --onto
sẽ gây ra một số vấn đề trong điều khiển từ xa.
Hơn nữa, tôi không muốn sửa đổi lịch sử thực sự. Nếu có mã xấu, nó đã ở đó trong lịch sử và có thể được nhìn thấy. Tôi chỉ muốn nó trong bản sao làm việc và tôi không bận tâm đến một cam kết hợp nhất ngược.
Nói cách khác, Git tương đương với các lệnh svn nào sau đây:
svn merge -r 303:295 http://svn.example.com/repos/calc/trunk
trong đó loại bỏ tất cả các thay đổi từ 295 đến 302 bằng cách hợp nhất ngược tất cả các thay đổi trong các phiên bản đó, như là một cam kết mới.
svn merge -c -302 ^/trunk
tất nhiên, hoàn tác cam kết 302, tất nhiên bằng cách thêm một cam kết khác, ngược lại hợp nhất các thay đổi từ cam kết tương ứng đó.
Tôi nghĩ rằng nó nên là một hoạt động khá đơn giản trong Git và một trường hợp sử dụng khá phổ biến. Những gì khác là điểm của cam kết nguyên tử?
Chúng tôi đã dàn dựng stashing và tất cả để đảm bảo các cam kết là hoàn toàn nguyên tử, không nên bạn có thể hoàn tác một hoặc nhiều hơn những cam kết nguyên tử một cách dễ dàng?