5.3 災難救援#
場景:救回誤刪的分支或 Commit#
你不小心刪了一條還沒合併的分支,或 git reset 回了太舊的版本——那些 commit 看起來消失了。別慌,在 Git 裡 commit 很少真的消失。
關鍵工具:git reflog#
Git 會默默記錄你 HEAD 的每一次移動(commit、切分支、reset、merge……),這份紀錄就是 reflog:
git reflog
輸出範例:
a1b2c3d HEAD@{0}: commit: 完成登入表單
e4f5g6h HEAD@{1}: reset: moving to HEAD~1
i7j8k9l HEAD@{2}: commit: 新增驗證邏輯
...
每一行都是你「曾經到過」的地方。就算 commit 已不在任何分支上,只要它在 reflog 裡,就救得回來。
救援三步驟#
第一步:找到出事前的位置
git reflog
從清單中找到出事前最後一個正常的 commit(如 i7j8k9l)。
第二步:直接回到那個位置
git reset --hard i7j8k9l
或者,如果是救回被刪掉的分支:
git branch feature/login i7j8k9l # 在那個位置重建分支
第三步:確認
git log --oneline
你的 commit 都回來了。
reflog 的保鮮期#
預設情況下,reflog 紀錄會保留 90 天,所以就算是幾週前的災難也多半有救。但別拖太久。
其他常見災難#
| 災難 | 解法 |
|---|---|
| 誤刪工作區的檔案(未 commit 過) | 救不回,Git 管不到沒追蹤的檔案 |
誤 git restore 丟掉修改 | 多半救不回,所以 restore 前要三思 |
| 誤 commit 機密檔案 | git rm --cached 移除追蹤 + 改密碼(歷史裡已經有了) |
| push 了不該 push 的 | 若是私人 repo 可 force push 改寫;公開 repo 視為已洩漏 |
黃金法則:越早發現、越早 reflog,越容易救。出事後先停下來,不要繼續亂操作。