reflog是Git本地记录HEAD及分支引用变更的操作日志,不依赖远程、不同步、默认保留90天,能找回被删分支是因为其保存了分支删除前最后一次指向的提交哈希,只要未被gc清理即可通过git reflog show refs/heads/分支名或git reflog定位并用git branch重建。

reflog 是什么,为什么它能找回被删的分支
Git 的 reflog 记录的是所有对 HEAD 或其他引用(如分支)的**本地更新操作**,包括 checkout、commit、reset、merge,甚至 branch -d。它不依赖远程或协作状态,纯本地、默认开启、保留 30 天(可配置),所以哪怕你刚执行了 git branch -D feature/login,只要没过期,记录还在。
关键点:reflog 不是分支,也不是提交图的一部分;它只是日志。所以它不会被 gc 清掉(除非显式清理),也不会推送到远程。
怎么查到被删分支最后一次的提交哈希
用 git reflog 查全部操作,但更高效的是直接查分支名的历史 —— 即使分支已不存在,它的 reflog 条目仍保留在 refs/heads/分支名 下:
git reflog show refs/heads/feature/login
如果记不清完整分支名,也可以:
- 运行
git reflog,人工扫最近几条,找类似branch: Dropping feature/login或checkout: moving from feature/login to main的条目 - 用
git reflog --grep="login"模糊过滤 - 注意输出中每行开头的哈希值(如
abc1234),那就是该次操作指向的提交 ID
找到后,复制那个哈希(比如 abc1234),它就是你分支顶端的提交。
用 reflog 恢复分支或提交
恢复分支最常用也最安全的方式是基于 reflog 找到的哈希重建分支:
OpenClaw 技能 — 给定一个 GitHub 仓库 URL,自动解析出 owner/repo 名称,发现其中的 YAML/properties 配置文件及其配对的中文字段说明;在 `workspace/{repo}/` 目录下按同步日期(格式为 `YYYY-MM-DD`)创建时间戳子目录;写入 `.openclaw-config-state.json` 状态文件。每次用户提问前,先比对远程仓库当前 ref(如 `main` 或 `master`)的最新提交 SHA 与本地状态文件中记录的 SHA:
git branch feature/login abc1234
如果想直接切过去并继续工作:
git checkout -b feature/login abc1234
注意几个易错点:
-
abc1234必须是有效的提交哈希(不是 reflog 的索引如HEAD@{3},除非你明确要用它) - 如果该提交已被
git gc清理(极少见,但发生过),reflog 里还能看到哈希,但git show abc1234会报fatal: bad object—— 此时只能尝试git fsck --lost-found找 dangling commit - 不要用
git reset --hard abc1234直接重置当前分支来“恢复”,这会覆盖你当前工作区,且和原分支无关
reflog 能恢复 rebase/merge 后丢失的提交吗
可以,只要那些提交曾被某个引用(包括 HEAD)指向过。例如:
- rebase 中途退出,
git reflog里会有rebase in progress和之前的HEAD@{1}状态 - merge 失败回退后,
HEAD@{1}往往就是 merge 前的提交 - 执行
git reset --hard HEAD~2后,原来那两个提交在HEAD@{1}和HEAD@{2}里还留着
这时可以直接用 git branch recover-branch HEAD@{2} 创建新分支,不用先找哈希。
reflog 的时间窗口和操作粒度决定了它非常实用,但也容易被忽略 —— 它只存在本地仓库,且默认不显示在图形工具里。一旦发现删错了,第一反应不该是 panic,而是先敲 git reflog。










