2015-08-26 23 views
6

Giả sử tôi muốn hoàn tác tất cả các thay đổi được giới thiệu bởi các cam kết trước đó.Sự khác nhau giữa git reset --hard và git checkout

Theo như tôi hiểu, git reset --hard <specified commit> sẽ xóa tất cả các cam kết cho đến khi cam kết được chỉ định và hoàn tác tất cả thay đổi.
Mặt khác, git checkout <specified commit> sẽ thay đổi thư mục của tôi để phản ánh cam kết được chỉ định.

Vì vậy, nếu tôi git reset sau git checkout nó sẽ có cùng kết quả như git reset --hard không?

Hoặc, nếu tôi chỉ đơn giản là git commit sau git checkout, cam kết mới được tạo có ghi đè các cam kết hiện có không?

+0

Nếu bạn cam kết sau khi thanh toán, bạn sẽ có điểm phân nhánh chứ không phải ghi đè. –

Trả lời

4

Tóm lại, git cam kết là một cái cây và nhánh chỉ là con trỏ tới một số cam kết.

git checkout <specified commit> không di chuyển con trỏ nhánh. Khi bạn làm điều này, bạn đang ở trạng thái đầu tách rời. Bạn sẽ thấy thông báo này, khá dễ hiểu:

Bạn đang ở trạng thái 'Tách biệt'. Bạn có thể xem xét xung quanh, thực hiện thay đổi thử nghiệm và cam kết các thay đổi đó và bạn có thể hủy bất kỳ cam kết nào bạn thực hiện ở trạng thái này mà không ảnh hưởng đến bất kỳ chi nhánh nào bằng cách thực hiện một lần thanh toán khác.

Nếu bạn muốn tạo chi nhánh mới để giữ lại các cam kết bạn tạo, bạn có thể làm như vậy (hiện tại hoặc sau này) bằng cách sử dụng -b với lệnh thanh toán một lần nữa. Ví dụ:

git checkout -b new_branch_name

khác biệt nữa là git checkout là an toàn hơn, bởi vì nó sẽ không từ chối thay đổi của bạn trong cây làm việc, và bạn sẽ không mất bất kỳ cam kết với it¹.

git reset --hard <specified commit>, mặt khác, sẽ di chuyển chi nhánh hiện tại của bạn đến cam kết được chỉ định và bạn sẽ mất tất cả thay đổi trong cây đang hoạt động. Ngoài ra, nếu bạn đang chuyển sang một số cam kết cũ hơn và các cam kết mới hơn không nằm trong một số chi nhánh khác, thì bạn cũng sẽ mất các cam kết mới hơn này quá. Nó không phải là một hoạt động an toàn và không làm điều này trừ khi bạn thực sự hiểu những gì bạn đang làm.

Xem thêm these great answers để biết thông tin về cách hoàn tác cam kết git.

Bạn cũng có thể hưởng lợi từ việc sử dụng công cụ GUI như SourceTree.


¹ - tốt, trừ khi bạn đã ở trạng thái đầu tách ra trên một số cam kết lơ lửng, nhưng thông thường bạn không nên lo lắng.

3

Vì vậy, nếu tôi git reset sau git checkout nó sẽ có kết quả tương tự như git reset --hard?

No.git reset (với --hard hoặc bất kỳ tùy chọn nào khác) đặt lại HEAD, vì vậy bạn luôn mất các cam kết, trừ khi bạn không chỉ định bất kỳ cam kết nào được đặt lại.

Sau khi bạn làm git checkout <commit> bạn đang ở trạng thái HEAD tách rời, vì vậy git reset hơi vô nghĩa vì bạn sẽ không đặt lại bất kỳ chi nhánh nào.

Hoặc, nếu tôi chỉ đơn giản là git commit sau git checkout, cam kết mới được tạo có ghi đè các cam kết hiện có không?

Không. Vì một lần nữa, bạn đang ở trạng thái HEAD tách rời. Về cơ bản, bạn đang tạo các cam kết trong một nhánh ma.

Điều an toàn nhất là luôn tạo chi nhánh mới với git checkout -b và sau khi bạn chắc chắn muốn đặt lại chi nhánh khác của mình, hãy thực hiện git reset --hard.

Các vấn đề liên quan