在使用 Git 的過程中,你是否曾經誤執行過 reset --hard
、rebase
、checkout
等指令,導致 commit 紀錄消失或分支歷史錯亂?
別擔心,Git 為你準備了一個「安全網」—— reflog(reference log)。
它就像是 Git 的黑盒子,記錄所有 HEAD 的變動歷史,讓你能追蹤每一次版本的變化並回溯。
reflog
是「參照日誌」(reference log)的縮寫。
Git 在本地端會為每一個分支與 HEAD 保留一份移動紀錄。
只要 HEAD 有移動(例如 commit、reset、merge、checkout),就會新增一筆紀錄。
簡單來說,git log
是「版本歷史」,而 git reflog
是「操作歷史」。
差異比較:
項目 | git log | git reflog |
---|---|---|
追蹤對象 | 分支歷史 | HEAD 變化 |
顯示內容 | 有效 commit | 包含被刪除的 commit |
是否共享 | 會隨分支推送 | 只存在本機 |
用途 | 檢視專案歷史 | 回復誤操作、追蹤 HEAD |
輸入以下指令可查看本地 HEAD 的歷史移動紀錄:
git reflog
範例輸出:
b1a2c3d (HEAD -> main) HEAD@{0}: commit: 修正登入頁 bug
d4e5f6a HEAD@{1}: reset: moving to HEAD~1
a7b8c9e HEAD@{2}: commit: 調整按鈕樣式
f0d1e2b HEAD@{3}: checkout: moving from main to feature/login
每一行紀錄代表一次 HEAD 的移動,包括:
假設你誤執行了:
git reset --hard HEAD~2
導致最新兩次 commit 消失。
這時可用以下步驟回復:
1️⃣ 查看 HEAD 的歷史紀錄
git reflog
找到 reset 之前的 commit,例如:
a7b8c9e HEAD@{3}: commit: 新增登入 API
2️⃣ 回到該版本
可使用 commit ID 或 HEAD 編號:
git reset --hard a7b8c9e
# 或
git reset --hard HEAD@{3}
此時 git log
會恢復原本的歷史。
除了 HEAD,你也可以針對分支查詢:
git reflog branch-name
例如:
git reflog feature/login
可以看到該分支的歷史變化,包含何時被建立、merge 或 rebase。
Git 預設會定期清理 reflog,保留時間如下:
類型 | 保存時間 |
---|---|
一般 commit | 約 90 天 |
被刪除的分支 | 約 30 天 |
因此,若要救回誤刪的版本,請盡早操作,以免紀錄被清除。
狀況 | 解決方式 |
---|---|
reset --hard 導致 commit 消失 |
用 git reflog 找回 commit |
rebase 操作錯誤 |
找出 rebase 前的 HEAD 版本 |
想知道昨天 HEAD 位置 | 使用 HEAD@{yesterday} |
誤刪分支 | 透過該分支的 reflog 找回 commit ID |
git reset --hard HEAD~2
模擬誤刪情境。git reflog
找出重置前的 commit ID。git reset --hard
回復到原始狀態。git log
是否恢復正常。git reflog
記錄所有 HEAD 變動歷史,是誤操作後的最後防線。git reset --hard HEAD@{n}
,可輕鬆回到任意時間點。記得這句原則:
「只要還能看到 reflog,就沒有真正失去的 commit。」