git reset và ba chế độ soft/mixed/hard
git reset and Its Three Modes
git reset là lệnh dời con trỏ nhánh về một commit khác, đồng thời quyết định số phận của những thay đổi. Nó có ba chế độ với mức độ ảnh hưởng rất khác nhau — hiểu sai có thể mất sạch công sức.
reset làm gì?
git reset <commit> dời con trỏ nhánh hiện tại (và HEAD) về <commit> chỉ định. Khác biệt giữa ba chế độ nằm ở chỗ: nó có đụng tới vùng staging staging area và working directory hay không.
# Dời nhánh lùi lại 1 commit (mặc định mixed)
git reset HEAD~1
HEAD~1 nghĩa là "commit ngay trước HEAD".
Ba chế độ
| Chế độ | Dời con trỏ | Staging area | Working directory |
|---|---|---|---|
--soft | Có | Giữ nguyên | Giữ nguyên |
--mixed (mặc định) | Có | Reset (unstage) | Giữ nguyên |
--hard | Có | Reset | Reset (xóa) |
--soft
Dời con trỏ nhưng giữ mọi thay đổi đã stage. Hữu ích khi muốn gộp các commit cuối lại hoặc viết lại commit message: lùi về trước, code vẫn nằm trong staging, sẵn sàng commit lại.
# Gỡ commit cuối nhưng giữ thay đổi đã staged
git reset --soft HEAD~1
--mixed (mặc định)
Dời con trỏ và unstage thay đổi, nhưng vẫn giữ nội dung trong working directory. Đây là chế độ mặc định khi không ghi cờ.
# Gỡ commit cuối, thay đổi quay về dạng chưa stage
git reset HEAD~1
--hard
Dời con trỏ và xóa sạch cả staging lẫn working directory về đúng commit đích.
# NGUY HIỂM: vứt bỏ commit cuối VÀ mọi thay đổi chưa lưu
git reset --hard HEAD~1
--hard phá hủy dữ liệu
git reset --hard xóa vĩnh viễn mọi thay đổi chưa commit trong working directory. Không có hộp thoại xác nhận. Commit đã bị gỡ vẫn còn trong reflog một thời gian, nhưng thay đổi chưa từng commit thì mất hẳn. Luôn git status và cân nhắc kỹ trước khi chạy.
reset vs revert
Hai lệnh dễ nhầm nhưng khác bản chất:
git resetdời con trỏ lùi lại, viết lại lịch sử cục bộ. Phù hợp khi commit chưa được push lên nhánh chung.git revert <commit>tạo một commit mới đảo ngược thay đổi của commit cũ, không xóa lịch sử. An toàn cho nhánh đã chia sẻ.
# Đảo ngược an toàn một commit đã push
git revert abc1234
Trọng tâm thi
Quy tắc vàng: dùng revert cho lịch sử đã chia sẻ/đã push (không viết lại lịch sử), dùng reset cho thay đổi cục bộ chưa push. reset --soft giữ staging, --mixed unstage, --hard xóa mọi thứ.
Tóm tắt
git resetdời con trỏ nhánh; ba chế độ khác nhau ở chỗ đụng tới staging và working directory.--softgiữ staging,--mixed(mặc định) unstage,--hardxóa sạch thay đổi chưa lưu.--hardphá hủy dữ liệu chưa commit — dùng cẩn thận.resetviết lại lịch sử (dùng khi chưa push);reverttạo commit đảo ngược (an toàn cho nhánh chung).