Git 历史回退自救手册:reflog 找回与分支指针恢复
该指南来自于一次自我感觉惊险的经历,
一份精简但可操作的“掉历史”自救清单:当你在 GUI 或命令行误操作后,发现最近提交“消失”时,如何快速定位并安全恢复。
典型症状
- 近期提交不见了:
git log
顶端不是你刚做的提交。 - 工作区回到旧版本:本地文件和远端网站内容明显“时光倒流”。
- 远端与本地不一致:
git status -sb
显示main...origin/main [ahead N|behind N]
。
成因与诱因(简明)
- 直接成因:分支指针被移到旧提交,或进入分离 HEAD,导致近期提交不在当前分支历史中。
- 前几天可能埋下的雷:
- 直接
git checkout <commit>
查看旧版本后继续开发/提交; - 用 GUI 的“Checkout/Reset/Restore”类功能回到旧提交但未建保护分支;
- 偶发
git reset --hard <old>
; - 未及时推送,远端与本地脱节,引发误判。
- 直接
- 今天触发的动作:在 GUI 中对某个旧提交执行了“Checkout/Reset”,把当前分支(例如
main
)指针回退了。
本次拯救(摘要)
-
用
reflog
找到目标提交<sha>
(历史未丢,只是指针偏了)。 -
二选一恢复:
# 安全合并法(推荐)
git checkout -b restore-work <sha>
git checkout main
git merge restore-work
# 或:直接重置法(快捷)
git checkout main
git reset --hard <sha>
- 如远端历史需以本地为准:
git push -f origin main
恢复步骤
# 1) 快速浏览当前可达历史
git log --oneline -10
# 2) 关键:查看 HEAD 的移动“航迹记录”
git reflog -20
- 在
reflog
输出中,找到你需要回到的那次正确提交的 SHA(记为<sha>
)。
两种恢复方式(择一)
# 从目标提交创建保护分支
git checkout -b restore-work <sha>
# 回到主分支并合并恢复
git checkout main
git merge restore-work
说明:保留现场,历史连贯,最不容易出岔子。
git checkout main
git reset --hard <sha>
说明:让当前分支指针“瞬移”到 <sha>
;如远端不是你想要的历史,后续可能需要强推。
同步远端(如有需要)
# 仅当你确认“本地才是正确历史”时才执行强推!
git push -f origin main
预防与习惯(精简版)
- 查看旧版本用新分支:
git checkout -b inspect-<date> <sha>
。 - 小步提交,及时推送:远端即备份。
- 危险操作前打快照:
git branch backup-<date>
或git tag safety-<date>
。 - 丢历史先看 reflog:优先
git reflog
,再考虑其他。