reflog能找回已删分支,因为删除分支仅移除指针,提交对象仍存在于本地对象数据库中,而reflog作为本地引用日志,持续记录HEAD及分支移动历史(默认保留90天),只要未执行git gc --prune=now或reflog过期,就能通过git reflog --all定位被删分支最后一次提交哈希并用git branch重建。

reflog 为什么能找回已删分支?
Git 的 reflog 记录的是本地所有引用(主要是 HEAD)的移动历史,哪怕分支被删、提交被“丢弃”,只要没被 GC 清理,那些提交对象还在对象数据库里,reflog 就还留着指向它们的指针。
关键点在于:reflog 是本地行为,不依赖远程仓库,也不受 git branch -d 影响——删分支只是删了分支名这个指针,reflog 里仍存着它曾经指向的提交。
常见错误现象:git checkout feature/login 报错 error: pathspec 'feature/login' did not match any file(s) known to git,但你知道刚删的分支里有未合并的关键提交。
怎么查到那个被删分支最后一次的提交?
直接运行:git reflog
然后肉眼扫最近几条,找带 checkout 或 commit 动作、且备注里含分支名(比如 feature/login@{0})的记录。
更精准的做法是:git reflog show feature/login
即使分支已删,只要 reflog 还没过期(默认保留 90 天),这条命令仍能输出该分支的历史移动轨迹。
如果记不清分支名,也可以:
git reflog | grep -i "checkout.*feature"注意:grep 匹配的是 reflog 的描述文本,不是 SHA1;部分旧版本 Git 可能不支持
reflog show <branch>,那就老实用 git reflog 全局查。
怎么把提交恢复成新分支?
找到目标提交的 SHA(比如 abc1234)或 reflog 式引用(比如 feature/login@{1}),执行:git checkout -b feature/login-restore abc1234
或更安全的一行:git switch -c feature/login-restore feature/login@{1}
要点:
-
git switch比git checkout更明确语义,避免误创建 detached HEAD - 别用
git branch feature/login abc1234后再checkout—— 多一步就多一个出错机会 - 如果原分支有多个提交,reflog 中
@{0}是最新一次检出位置,@{1}是上一次,依此类推;@{0}不一定等于分支删除前的 tip,得看操作序列
reflog 会自动清理,哪些情况容易找不到?
reflog 默认保留 90 天(core.logAllRefUpdates 开启前提下),但以下操作会提前擦除相关记录:
- 手动执行
git reflog expire --expire=now --all - 运行
git gc且配置了gc.reflogExpire(默认值就是 90 天,但可被覆盖) - 长期不用的引用(如已删分支)在
git gc时可能被判定为“不可达”,虽 reflog 还在,但对应 commit 对象若无其他引用指向,会被 GC 回收
所以别等出事才查——日常开发中,删分支前顺手 git log -n 3 feature/login 看一眼,或者用 git branch -v 确认是否真没 merge,比事后翻 reflog 省力得多。


















