Nâng CaoGit iconGit

Vô tình `git reset --hard` xóa mất 3 commit chưa push, làm sao recover?

git reflog lưu lại MỌI thay đổi của HEAD trong ~90 ngày (mặc định), kể cả các commit "đã mất".

Quy trình recover:

bash
git reflog
# Output:
# abc123 HEAD@{0}: reset: moving to HEAD~3
# def456 HEAD@{1}: commit: feat: add payment service
# ghi789 HEAD@{2}: commit: feat: add cart logic
# jkl012 HEAD@{3}: commit: feat: add product model

Tìm hash của commit cuối cùng trước khi reset, rồi:

bash
# Recover tất cả 3 commits:
git reset --hard def456

# Hoặc cherry-pick từng commit:
git cherry-pick jkl012 ghi789 def456

Ví dụ: mất 3 commit liên tiếp — dùng git reset --hard def456 (hash của commit cuối trước khi reset, tức HEAD@{1} trong ví dụ trên). Không dùng HEAD@{4} vì sẽ đi xa hơn cần thiết.

Lưu ý:
- reflog chỉ tồn tại trong local repo — clone lại từ remote sẽ KHÔNG có. Phải recover trên máy đã reset.
- git gc chạy định kỳ có thể xóa unreachable commit sau thời gian ngắn. Recover sớm.
- Stash bị mất: git fsck --lost-found rồi tìm dangling commit.

Phòng tránh: trước khi reset --hard luôn tạo backup branch: git branch backup/safe-point.

Xem toàn bộ Git cùng filter theo level & chủ đề con.

Mở danh sách Git