能找回,只要被删分支最后一次引用未超reflog默认保留期(通常90天),其提交哈希仍存在于reflog中,可通过git reflog --all定位后用git branch重建分支。

git reflog 能找回被删的分支吗
能,只要分支最后一次被引用的时间没超过 reflog 的默认保留期(通常是 90 天),就大概率能找回来。reflog 记录的是本地仓库中所有 HEAD 和分支指针的移动历史,哪怕分支被 git branch -d 或 git branch -D 删除,只要它曾经被检出、合并或重置过,操作痕迹就在 reflog 里。
注意:这个操作只对**本地分支**有效,远程分支删除后需靠 git ls-remote 或服务器备份恢复,reflog 不记录远程动作。
-
git reflog默认显示 HEAD 的操作历史;加--all可查看所有引用(包括已删分支的残留记录) - 如果记得分支名,直接用
git reflog show <branch-name>,即使分支已不存在也能查到它的最后提交哈希 - 输出中的
HEAD@{0}、HEAD@{1}是时间索引,不是 Git 提交 ID,不能直接用于git checkout,但可配合git checkout -b <new-branch> HEAD@{3}恢复
从 reflog 找回分支的三步实操
找回的关键不是“猜提交”,而是定位那个分支最后一次指向的 commit,然后用它重建分支。
- 运行
git reflog --all | grep <branch-name>(比如git reflog --all | grep feat/login),快速过滤出该分支相关记录 - 找到类似
abc1234 (refs/heads/feat/login): checkout: moving from main to feat/login这样的行,提取出前面的abc1234—— 这就是分支最后的提交 ID - 执行
git branch feat/login abc1234,分支立刻重建;如果想同时切换过去,用git checkout feat/login或git switch feat/login
别用 git checkout abc1234 再手动建分支,容易漏掉原分支的完整提交链(尤其涉及 merge commit 时)。
reflog 失效或找不到记录的常见原因
reflog 不是永久日志,也不是所有操作都会被记录。以下情况会导致“查无此分支”:
-
reflog被手动清理过:git reflog expire --expire=now --all会立即清空全部记录 - 分支从未被检出(
git checkout/git switch)、未被合并、也未被重置过,仅靠git branch <name> <commit>创建后就直接删了——这种分支在reflog中可能完全无迹可寻 - 本地仓库被克隆自他人 repo,且你从未操作过该分支,那么你的
reflog里自然没有它的痕迹 -
core.logAllRefUpdates配置为false(极少见,默认是true),会导致部分引用更新不记日志
遇到这种情况,得转向 git fsck --lost-found 扫描悬空对象,但成功率低、耗时长,且无法还原分支名和结构。
避免下次再丢分支的两个硬习惯
救援永远比预防麻烦。两个低成本动作能大幅降低风险:
- 删分支前加个确认步骤:
git branch -d <name> && echo "✅ deleted" || echo "⚠️ failed or protected",至少留个 shell 历史可查 - 对重要功能分支,推送到远程时加
:<name>显式命名,比如git push origin HEAD:refs/heads/feat/login-review,这样即使本地删了,远程还挂着,且名字清晰可辨
reflog 是本地时间机器,但它不会提醒你什么时候该按快门——你得自己记住关键节点在哪次操作之后。


















