Skip to content

4. Reflog (The Life Saver)

TIP

SECRET: Git KHÔNG BAO GIỜ xóa cái gì ngay lập tức. Kể cả khi bạn git reset --hard hay xóa branch, code vẫn nằm đâu đó trong database của Git khoảng 30 ngày.

4.1 Reflog là gì?

Reference Logs. Nó là hộp đen ghi lại mọi hành động con trỏ HEAD đã di chuyển. Kể cả những hành động không tạo ra commit (như reset, rebase, checkout).

4.2 Cứu dữ liệu (git reflog)

Kịch bản thảm họa: Bạn lỡ tay git reset --hard và mất sạch code cả buổi chiều. Bạn hoảng loạn? Đừng lo.

  1. Xem lại lịch sử di chuyển:

    bash
    git reflog

    Output:

    text
    a1b2c3d HEAD@{0}: reset: moving to HEAD~1
    99e8d7f HEAD@{1}: commit: add super cool feature (Đây là cái bạn vừa mất)
  2. Khôi phục: Bạn thấy 99e8d7f chính là thời điểm trước khi bạn reset. Hãy reset về đó:

    bash
    git reset --hard 99e8d7f

    -> Bùm! Code đã trở lại.


👑PREMIUM

HPN Interview Kit

Bộ câu hỏi phỏng vấn Big Tech

  • ✓ 200+ câu hỏi thực tế từ FAANG
  • ✓ Giải thích chi tiết bằng Tiếng Việt
  • ✓ Cập nhật liên tục 2025
Sở hữu ngay99k

🧠 Quiz

Câu 1: Git Reflog ghi lại thông tin gì?

  • [ ] A) Lịch sử tất cả commits trên remote
  • [ ] B) Danh sách tất cả branches đã tạo
  • [x] C) Lịch sử mọi thay đổi của HEAD và branch tips trên local repository
  • [ ] D) Log của tất cả git commands đã chạy

💡 Giải thích: Reflog (reference log) ghi lại mỗi lần HEAD hoặc branch tip thay đổi trên local. Bao gồm commit, reset, checkout, rebase, merge... Đây là "safety net" cuối cùng để recovery.

Câu 2: Sau khi chạy git reset --hard HEAD~3 nhầm, làm cách nào recovery?

  • [ ] A) Không thể recovery, data đã mất vĩnh viễn
  • [x] B) Dùng git reflog tìm SHA của commit trước khi reset, rồi git reset --hard <SHA>
  • [ ] C) Dùng git undo để hoàn tác
  • [ ] D) Clone lại repository từ remote

💡 Giải thích: git reflog lưu lại mọi vị trí HEAD đã đi qua. Sau reset nhầm, dùng reflog tìm SHA commit trước đó (ví dụ HEAD@{1}), rồi git reset --hard <SHA> để quay về. Reflog là "life saver" thực sự.

Câu 3: Reflog entries bị xóa sau bao lâu theo mặc định?

  • [ ] A) Ngay lập tức sau khi git gc
  • [ ] B) 7 ngày
  • [x] C) 90 ngày cho reachable entries, 30 ngày cho unreachable entries
  • [ ] D) Không bao giờ bị xóa

💡 Giải thích: Mặc định, git gc xóa reflog entries unreachable sau 30 ngày và reachable sau 90 ngày. Đây là lý do cần recovery sớm - càng để lâu, càng có nguy cơ reflog bị garbage collected.