能找回,git reflog可恢复因git reset --hard、git branch -d或git branch -d导致“丢失”的分支,因其仅移除引用而非提交对象,只要未被git gc清理,reflog中仍保留其最后一次提交哈希,通过git reflog --all定位后用git branch重建即可。

git reflog 能找回哪些“丢失”的分支
当用 git reset --hard 回退、git branch -D 强删、或合并后 git branch -d 删除了已合并分支,这些操作不会真正删除提交对象,只是移除了引用(branch 指针)。只要那些提交还没被 Git 的垃圾回收(默认 30 天内不会清理),git reflog 就能翻出它们的 SHA1 值。
注意:reflog 记录的是你本地仓库 HEAD 和各分支指针的历史移动轨迹,它不随 git push 同步,也不在远程仓库上存在——所以这招只对本地误操作有效。
用 git reflog 找到被删分支最后一次提交的 SHA
执行 git reflog,你会看到类似这样的输出:
abc1234 HEAD@{0}: reset: moving to HEAD~2
def5678 HEAD@{1}: checkout: moving from feature/login to main
ghi9012 HEAD@{2}: commit: add login validation
jkl3456 HEAD@{3}: branch: Created from HEAD
关键不是看 HEAD@{n},而是找那行带原分支名(比如 feature/login)的记录,再看它对应的 SHA(如 def5678);如果分支已被删,也可以查 git reflog show feature/login(即使分支不存在,只要 reflog 还有残留记录就能查)。
- 如果记不清分支名,用
git reflog --all | grep "checkout\|branch"筛选线索 -
reflog默认只显示 HEAD 的,加--all才能看到所有分支指针的历史 - SHA 值只需前 7 位就足够定位,不用抄全
用 git checkout 或 git switch 恢复分支
拿到 SHA 后,有两种常用恢复方式:
- 想恢复成同名分支:
git checkout -b feature/login ghi9012 - Git 2.23+ 推荐用:
git switch -c feature/login ghi9012 - 如果只是想临时看看内容,直接
git checkout ghi9012进入 detached HEAD 状态也行
注意:不要用 git checkout ghi9012 && git branch feature/login 这种两步写法——万一中间误操作,容易丢上下文。一步建分支更稳。
reflog 清理与防丢建议
reflog 不是永久保险柜。Git 会在以下情况自动清理旧记录:
- 执行
git gc(手动触发垃圾回收) - 某些 IDE 或 GUI 工具后台调用
git prune - 超过
core.reflogExpire设置天数(默认 90 天 for reachable, 30 days for unreachable)
日常建议:git config --global core.reflogExpire "90.days" 加长保留期;重要分支删除前,先 git log -n 3 feature/name 看一眼最新提交信息,心里有底。
最易忽略的一点:reflog 只存在于本地,且每个克隆副本独立维护。你在同事机器上执行的 reflog 查不到你本地删掉的分支——这事没法远程抢救,得趁早动手。











