reflog是Git本地仓库的“操作流水账”,记录HEAD及分支等引用的所有变更历史(如checkout、reset、branch -D),默认保留90天,可据此找回被删分支的最后一次提交哈希并重建分支。

reflog 是什么,为什么它能找回被删的分支
Git 的 reflog 是本地仓库的“操作流水账”,记录所有对 HEAD 和引用(比如分支)的更新动作,包括 checkout、merge、reset、branch -d。它不依赖远程或 push 记录,纯本地、默认开启、默认保留 90 天(可配置)。哪怕你用 git branch -D feature/login 强制删掉分支,只要删之前那个分支的提交还在 reflog 里,就能捞回来。
-
reflog不同步到远程,也不参与fetch/push - 每次
git checkout切换分支,reflog 都会记一条新记录 - 被删分支的最后一次提交哈希,通常还保留在
HEAD@{n}或refs/heads/feature/login@{0}这类条目中
怎么查到被删分支最后一次提交的哈希
运行 git reflog,找带分支名或相关操作的行;如果记得分支名,直接过滤更高效:
git reflog | grep feature/login
或者更准一点(只看该分支曾存在的 reflog 条目):
git reflog show refs/heads/feature/login
如果提示 “no logs for refs/heads/feature/login”,说明该分支在 reflog 中已被清理(比如执行过 git reflog expire --expire=now --all),但别急——它可能还在 HEAD 的操作历史里:
git reflog --date=iso
然后逐行扫,重点看 checkout:、commit:、reset: 这些动作,找到类似这样的行:
abc1234 HEAD@{5}: checkout: moving from feature/login to main
这里的 abc1234 就是 feature/login 分支被切走前的最新提交哈希。
用 reflog 创建新分支恢复提交
拿到哈希后,直接用 git branch 命令基于它新建分支:
git branch feature/login abc1234
如果想一步到位并立即切换过去:
git checkout -b feature/login abc1234
注意几个关键点:
- 不要写成
git branch feature/login HEAD@{5}——HEAD@{5}是相对引用,在某些 shell 或脚本中可能被提前解析出错;稳妥做法是先git reflog看清哈希,再复制粘贴使用 - 如果原分支有未 push 的 merge 提交,reflog 里可能有多个相关哈希,优先选最靠近“checkout out”那条的,通常是最新状态
- 新建分支后,
git log feature/login确认提交数量和内容是否符合预期
reflog 清理风险与预防建议
reflog 不是永久保险箱。以下操作会主动清除它:
git reflog expire --expire=now --all-
git gc(默认会触发 reflog 过期清理) - 设置
core.logAllRefUpdates = false后的新仓库不会记录 reflog(极少见,一般不用动)
日常建议:
- 不要随意运行
git gc --prune=now,尤其在刚删错分支后 - 对重要功能分支,删之前先
git branch backup/feature-login留个影 - 如果团队协作频繁,误删后尽快恢复,避免其他人基于旧 HEAD 继续开发导致冲突升级
reflog 能救回的只是本地已存在、尚未被 GC 回收的提交;它不保存工作区修改或暂存区状态——如果你删分支前还有没 add 的文件,那些得靠系统回收站或编辑器本地历史。











