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ốngLệnh thường phù hợp
Bỏ thay đổi chưa stage trong filegit restore file
Unstage nhưng giữ codegit restore --staged file
Sửa commit cuối chưa sharegit commit --amend
Di chuyển branch local về commit cũgit reset
Undo commit đã sharegit revert
Tìm commit “bị mất” localgit reflog

2. Reset

git-reset

Di chuyển current branch/HEAD và tùy mode cập nhật index + working tree.
Official docs ↗
Cú pháp
git reset [--soft|--mixed|--hard] <commit>
Hiểu đơn giản
Hãy học reset bằng ba vùng: HEAD/history, Index, Working Tree.
git reset --soft HEAD~1
git reset HEAD~1          # --mixed mặc định
git reset --hard HEAD~1
ModeHEADIndexWorking Tree
--softmovegiữgiữ
--mixedmoveresetgiữ
--hardmoveresetreset
--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.
Official docs ↗
Cú pháp
git revert <commit>
Hiểu đơn giản
Không xóa commit cũ khỏi history; vì vậy thường phù hợp với branch đã chia sẻ.
git revert abc123
git revert HEAD
A---B---C---D
        ^   ^
        |   └─ D đảo ngược C
        └───── C vẫn tồn tại

4. Reflog — recovery local

git-reflog

Xem lịch sử cập nhật của refs local như HEAD.
Official docs ↗
Cú pháp
git reflog [show]
Hiểu đơn giản
Rất hữu ích sau reset/rebase/branch deletion khi commit dường như biến mất nhưng object vẫn còn.
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 abc123
Reflog 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