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.
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 đè. –