Hoàn tác một cam kết là một chút đáng sợ nếu bạn không biết làm thế nào nó hoạt động. Nhưng nó thực sự dễ dàng đáng kinh ngạc nếu bạn hiểu.
Giả sử bạn có cái này, trong đó C là CHÍNH của bạn và (F) là trạng thái của các tệp của bạn.
(F)
A-B-C
↑
master
Bạn muốn nuke cam kết C và không bao giờ nhìn thấy nó nữa và mất tất cả các thay đổi trong các tệp sửa đổi cục bộ . Bạn làm điều này:
git reset --hard HEAD~1
Kết quả là:
(F)
A-B
↑
master
Bây giờ B là ĐẦU. Vì bạn đã sử dụng --hard
, các tệp của bạn được đặt lại về trạng thái của chúng tại cam kết B.
À, nhưng giả sử cam kết C không phải là một thảm họa, nhưng chỉ là một chút thôi. Bạn muốn hoàn tác cam kết nhưng giữ các thay đổi của bạn để chỉnh sửa một chút trước khi bạn thực hiện cam kết tốt hơn. Bắt đầu lại từ đây, với C là ĐẦU của bạn:
(F)
A-B-C
↑
master
Bạn có thể làm điều này, bỏ qua --hard
:
git reset HEAD~1
Trong trường hợp này, kết quả là:
(F)
A-B-C
↑
master
Trong cả hai trường hợp, HEAD chỉ là một con trỏ đến cam kết mới nhất. Khi bạn thực hiện một git reset HEAD~1
, bạn nói với Git để di chuyển con trỏ CHÍNH trở lại một lần xác nhận. Nhưng (trừ khi bạn sử dụng --hard
) bạn để các tập tin của bạn như cũ. Vì vậy, bây giờ git status
cho thấy những thay đổi bạn đã kiểm tra vào C. Bạn đã không mất một thứ!
Đối với các liên lạc nhẹ nhất, bạn thậm chí có thể hoàn tác cam kết của mình nhưng để lại các tệp và chỉ mục của bạn :
git reset --soft HEAD~1
Điều này không chỉ để các tập tin của bạn một mình, nó thậm chí còn để lại chỉ mục của bạn . Khi bạn làm như vậy git status
, bạn sẽ thấy các tệp tương tự nằm trong chỉ mục như trước đây. Thực tế, ngay sau lệnh này, bạn có thể làm git commit
và bạn sẽ làm lại cùng một cam kết mà bạn vừa có.
Một điều nữa: Giả sử bạn phá hủy một cam kết như trong ví dụ đầu tiên, nhưng sau đó bạn phát hiện ra bạn cần nó ? May mắn, phải không?
Không, vẫn còn một cách để lấy lại. Gõ git reflog
và bạn sẽ thấy một danh sách các (một phần) cam kết Shas (có nghĩa là, băm) mà bạn đã di chuyển xung quanh trong Tìm cam kết bạn bị phá hủy, và làm điều này.:
git checkout -b someNewBranchName shaYouDestroyed
Bây giờ bạn đã hồi sinh cam kết đó. Các cam kết không thực sự bị phá hủy trong Git trong khoảng 90 ngày, vì vậy bạn thường có thể quay lại và giải cứu một người mà bạn không có ý định loại bỏ.