Git reflog是本地仓库的“操作黑匣子”,默认保留90天,可找回误删分支或丢失commit;需用git reflog定位哈希,再通过git branch或git reset恢复,但不保证被gc清理后的数据。

Git reflog 是你本地仓库的“操作黑匣子”,只要没被 gc 清理掉,90 天内误删的 commit 几乎都能捞回来——它不依赖远程、不靠 push 记录,纯看本地 HEAD 跳过哪些提交。
git reflog 查不到被删 commit?先确认 reflog 是否还活着
reflog 默认保留 90 天(gc.reflogExpire 控制),但以下操作会提前清空:
-
git reflog expire --expire=now --all—— 立刻清空所有 reflog -
git gc—— 默认触发 reflog 过期清理(尤其在git fetch或git pull后自动运行)
如果 git reflog 输出为空或没看到目标 commit,别急着放弃:
- 试
git reflog --date=iso,手动扫checkout:、reset:、commit:行,找类似abc1234 HEAD@{5}: checkout: moving from feature/login to main的记录 - 用
git fsck --lost-found找“悬空对象”(dangling commit),但需配合git show <hash>逐个确认内容,效率低且不保证完整
git reset --hard 之后怎么找回刚删掉的 commit
执行 git reset --hard 后,HEAD 指针跳走,原提交变成“不可达”,但 reflog 里还留着上一步的哈希。关键不是记命令,是盯住 HEAD@{1}:
-
git reflog输出中,当前状态是HEAD@{0},上一个状态就是HEAD@{1}—— 那就是你刚 reset 掉的提交 - 直接
git reset --hard HEAD@{1}就能回退一步;如果已经切了分支或做了其他操作,HEAD@{1}可能不是你要的,得看 reflog 时间戳对齐 - 别用
git reset --hard HEAD^补救 —— 它只退父提交,和 reflog 无关,可能越退越远
示例:
git reflog
b2c4d8e HEAD@{0}: reset: moving to b2c4d8e
a1f0e3d HEAD@{1}: commit: fix typo in README
9d8c7b6 HEAD@{2}: checkout: moving from feature/login to main
你想恢复 a1f0e3d,就 git reset --hard a1f0e3d 或 git reset --hard HEAD@{1}。
git branch -D 误删分支后,怎么重建并找回未 push 的提交
强制删分支只是删了分支指针,只要那个分支最后一次提交还在 reflog 里,就能复活:
- 查分支专属 reflog:
git reflog show refs/heads/feature/login(如果报 “no logs”,说明该分支 reflog 已过期,但可能还在HEAD@{n}里) - 更通用的方法:
git reflog | grep feature/login或git reflog --date=iso | grep "moving from feature/login" - 拿到哈希(比如
abc1234)后,不要写git branch feature/login HEAD@{3}—— 相对引用在脚本或某些 shell 中会被提前解析出错;稳妥做法是复制粘贴哈希 - 重建分支:
git branch feature/login abc1234;想同时切换过去:git checkout -b feature/login abc1234
注意:如果原分支有 merge 提交,reflog 里可能有多个哈希,优先选最靠近 checkout: moving from feature/login 的那条,通常是最新状态。
reflog 恢复后,如何安全推送到远程
reflog 恢复的是本地状态,远程不会自动同步。推送前必须判断是否已存在冲突:
- 如果原分支还没被删(比如只是本地删了,远程还有),直接
git push origin feature/login即可 - 如果远程分支已被删,且你恢复的是新分支名(如
rescue/login),直接git push origin rescue/login - 如果要覆盖远程同名分支(例如远程也被删了,你想把本地恢复的
feature/login强推回去),必须加-f:git push -f origin feature/login—— 这会改写远程历史,团队协作中需提前通知所有人
reflog 不是永久保险箱,它的价值只在“你还没意识到删错了”的那几十分钟到几周内。真正防误删,靠的是习惯:每次 git reset --hard 前先 git reflog 瞅一眼,删分支前先 git log -n 3 feature/login 确认内容,比事后抢救省力十倍。


















