Giao diện
Git Disaster Recovery Cheatsheet 🚑
Trang này dành cho lúc bạn đang căng như dây đàn và chỉ cần câu trả lời an toàn nhất.
IMPORTANT
Protocol 30 giây trước khi gõ gì đó nguy hiểm:
git statusgit log --oneline --decorate -n 10- Nếu vừa
reset,rebase,checkoutlung tung:git reflog - Nếu branch đã push cho team: ưu tiên
revert, khôngreset --hard+ force push - Nếu lộ secret: rotate/revoke trước, dọn Git sau
1) Commit nhầm branch
Khi chưa push
- An toàn nhất:
bash
git branch rescue/wrong-branch
git reset --soft HEAD~1
git switch <branch-dung>
git commit -m "..."- Vì sao:
reset --softbỏ commit nhưng giữ toàn bộ thay đổi trong staging để bạn commit lại đúng chỗ. Tạorescue/*trước để luôn có phao cứu sinh. - Xác minh recovery:
bash
git log --oneline --decorate -n 3
git statusKhi đã push nhầm lên shared branch
- An toàn nhất:
bash
git switch <branch-dung>
git cherry-pick <sha>
git switch <branch-sai>
git revert <sha>- Vì sao: shared branch không nên rewrite history;
cherry-pickmang commit sang đúng nơi,revertdọn nhánh sai mà không phá lịch sử. - Xác minh recovery: commit xuất hiện trên branch đúng, branch sai có thêm commit revert, CI xanh.
2) Merge hỏng
Nếu merge đang dở dang
- An toàn nhất:
bash
git merge --abort- Vì sao: quay về đúng trạng thái trước khi merge bắt đầu; ít rủi ro hơn chữa conflict trong hoảng loạn.
- Xác minh recovery:
bash
git status
git log --oneline --decorate -n 5Nếu merge commit đã tạo rồi hoặc đã push
- An toàn nhất:
bash
git revert -m 1 <merge-commit-sha>- Vì sao: đảo tác dụng của merge commit mà vẫn giữ lịch sử rõ ràng cho team.
- Xác minh recovery:
git show <new-revert-sha>cho thấy nội dung được đảo ngược; test hoặc smoke check pass.
3) Rebase hỏng
Nếu rebase đang chạy
- An toàn nhất:
bash
git rebase --abort- Vì sao: quay lại đúng trạng thái trước rebase, nhanh và an toàn nhất khi chưa hiểu conflict.
- Xác minh recovery:
git statussạch,git log --oneline --decorate -n 5trở về lịch sử cũ.
Nếu rebase đã chạy xong nhưng kết quả sai
- An toàn nhất:
bash
git reflog
git branch rescue/pre-rebase <sha-truoc-rebase>
git reset --hard <sha-truoc-rebase>- Vì sao: reflog là hộp đen của HEAD; branch cứu hộ giúp bạn không mất thêm gì trước khi reset.
- Xác minh recovery: so
git log --oneline --decorate -n 10với trạng thái mong muốn; diff lại với branch remote nếu cần.
WARNING
Không casual rebase main hoặc branch shared. Nếu đã lỡ push rebase lên branch private, chỉ dùng git push --force-with-lease, không dùng --force mù quáng.
4) Lỡ reset --hard và tưởng mất sạch
- An toàn nhất:
bash
git reflog
git branch rescue/lost-work <sha-bi-mat>
git switch rescue/lost-work- Vì sao: commit thường chưa mất ngay; branch mới khóa commit lại trước khi bạn làm bước tiếp theo.
- Xác minh recovery:
bash
git log --oneline --decorate -n 5
git statusNếu muốn đưa branch cũ về đúng chỗ:
bash
git switch <branch-cu>
git reset --hard <sha-bi-mat>5) Commit nhầm secret
- An toàn nhất:
bash
# 1) Rotate / revoke secret NGAY ngoài hệ thống liên quan
# 2) Báo team / security nếu đã push
# 3) Sau đó mới dọn Git history
git filter-repo --path .env --invert-paths
# hoặc dùng --replace-text nếu secret nằm trong file cần giữ lại- Vì sao: secret bị lộ phải được xem là đã compromise. Xóa khỏi Git trước khi rotate là sai thứ tự ưu tiên.
- Xác minh recovery:
bash
git log --all -- .env
git grep -n "TEN_SECRET_CU" $(git rev-list --all)Kiểm tra thêm secret scanning và xác nhận key cũ đã bị vô hiệu hóa.
6) Gắn sai release tag
Nếu tag chưa push
- An toàn nhất:
bash
git tag -d v1.2.3
git tag -a v1.2.3 <correct-sha> -m "Release v1.2.3"- Vì sao: tag local là con trỏ; sửa local trước khi publish rất rẻ.
- Xác minh recovery:
git show v1.2.3
Nếu tag đã push
- An toàn nhất:
bash
git tag -d v1.2.3
git push origin :refs/tags/v1.2.3
git tag -a v1.2.3 <correct-sha> -m "Release v1.2.3"
git push origin v1.2.3- Vì sao: phải xóa tag sai ở remote trước khi đẩy lại; nếu team policy cấm di chuyển tag đã phát hành, hãy tạo tag mới như
v1.2.4. - Xác minh recovery:
bash
git ls-remote --tags origin
git show v1.2.37) Có bad commit đã push lên main
- An toàn nhất:
bash
git revert <bad-sha>
git push origin main- Vì sao:
mainlà branch shared; rollback an toàn phải là commit mới, không viết lại lịch sử. - Xác minh recovery:
bash
git log --oneline --decorate -n 5
git show HEADCI phải pass và production symptom phải biến mất.
8) Cần lấy đúng 1 hotfix commit, không lấy cả branch
- An toàn nhất:
bash
git switch main
git cherry-pick -x <hotfix-sha>- Vì sao:
-xghi lại nguồn gốc commit, rất hữu ích khi audit incident hoặc backport về sau. - Xác minh recovery:
bash
git log --oneline --decorate -n 3
git show HEADĐảm bảo chỉ có đúng diff cần thiết, không kéo theo commit dở dang khác.
Bảng nhớ nhanh: chọn lệnh nào?
| Sự cố | Lệnh / workflow ưu tiên |
|---|---|
| Commit sai branch, chưa push | reset --soft + commit lại |
| Commit sai branch, đã push | cherry-pick sang đúng branch + revert ở branch sai |
| Merge đang conflict | git merge --abort |
| Merge commit xấu đã tạo | git revert -m 1 <merge-sha> |
| Rebase đang chạy | git rebase --abort |
| Rebase xong nhưng sai | git reflog + reset về pre-rebase SHA |
Lỡ reset --hard | git reflog + tạo rescue/* branch |
| Secret bị commit | Rotate trước rồi filter-repo / replace text |
| Tag release sai | xóa tag sai, tạo lại đúng SHA |
Bad commit đã lên main | git revert <sha> |
| Chỉ cần 1 hotfix commit | git cherry-pick -x <sha> |