Git Handbook
05 · Undo & Recovery
Phân biệt restore, amend, reset, revert và reflog để sửa sai mà không vô tình phá lịch sử hoặc mất code.
1. Chọn đúng công cụ undo
| Tình huống | Lệnh thường phù hợp |
|---|---|
| Bỏ thay đổi chưa stage trong file | git restore file |
| Unstage nhưng giữ code | git restore --staged file |
| Sửa commit cuối chưa share | git commit --amend |
| Di chuyển branch local về commit cũ | git reset |
| Undo commit đã share | git revert |
| Tìm commit “bị mất” local | git reflog |
2. Reset
git-reset
Di chuyển current branch/HEAD và tùy mode cập nhật index + working tree.
git reset --soft HEAD~1
git reset HEAD~1 # --mixed mặc định
git reset --hard HEAD~1| Mode | HEAD | Index | Working Tree |
|---|---|---|---|
--soft | move | giữ | giữ |
--mixed | move | reset | giữ |
--hard | move | reset | reset |
--hard có thể phá hủy thay đổi chưa commit. Trước khi dùng, chạy git status và cân nhắc tạo branch/tag/stash bảo hiểm.3. Revert cho shared history
git-revert
Tạo commit mới đảo ngược thay đổi của commit đã chọn.
git revert abc123
git revert HEADA---B---C---D
^ ^
| └─ D đảo ngược C
└───── C vẫn tồn tại4. Reflog — recovery local
git-reflog
Xem lịch sử cập nhật của refs local như HEAD.
git reflog
# tìm SHA trước thao tác sai
git switch -c recovery abc123
# hoặc sau khi chắc chắn:
git reset --hard abc123Reflog là local. Đừng coi nó là backup vĩnh viễn.
5. Restore source từ commit cũ
git restore --source=HEAD~2 -- src/config.js
# review
git diff
# stage nếu đúng
git add src/config.js