首页/开发/Git 与协作速查/找回悬空提交与误删数据
Git 基础与命令88 条

找回悬空提交与误删数据

恢复流程:fsck --lost-found 或 reflog 定位无引用提交,git show 核对内容后用 branch/reset 接回历史。

Git 与协作速查开发更新于 2026-10-13

找回悬空提交是什么

误重置、误删分支、误改写提交之后,内容通常并没有立刻消失,只是失去了引用而变成悬空对象。恢复的路径是:先用 git reflog 或 git fsck --lost-found 定位那个没有引用的提交,用 git show 确认内容无误,再把它挂回一个分支或标签上。关键点在于快——一旦经过 gc 的彻底清理,不可达对象就再也找不回来了。这套方法只适用于进入过对象库的内容。

基本信息

适用场景误 reset、误删分支、误 amend
定位手段git reflog 或 git fsck --lost-found
接回方式git branch <名称> <提交号> 或 git reset --hard <提交号>
时效对象被 gc 清理后无法恢复
平台任意 Git 客户端

典型使用场景

  • 误执行重置,本地提交从分支上消失
  • 误删分支后想找回上面的提交
  • amend 或交互式变基改坏历史,需要回到改写前
  • 强制重置到头之后发现丢了大段工作
  • 排查「提交怎么不见了」并把它重新接回分支
  • 恢复后把结果立即挂到分支,避免再次被清理

常用示例

常用示例
git reflog | head -20                # 先看近期 HEAD 变动
git fsck --lost-found                # 列出悬空对象
git show <提交号>                    # 核对内容
git branch rescued <提交号>          # 挂回一个分支
git reset --hard <提交号>            # 或把当前分支移到该提交

两种定位手段

手段适用
git reflog本地 HEAD 或分支的近期移动记录,最快
git fsck --lost-found扫描无引用对象,覆盖更全
reflog 记录的是本地引用移动历史,定位近期失误通常最快;fsck 适合兜底扫描,但输出量大需要人工筛选。
对象一旦被 gc 的彻底清理动作清掉就无法恢复,找回动作要早,且恢复后尽快挂到分支或标签上。

恢复的标准流程

  • 先用 git reflog 找近期 HEAD 变动,快速定位嫌疑提交
  • reflog 找不到再用 git fsck --lost-found 扫描悬空对象
  • git show 逐条核对内容,确认是不是要找回的那份
  • git branch 或 git reset 把它接回应有位置
  • 立即提交或推送留底,避免后续清理再把它带走

易错点

  • 从未进入对象库的改动(只在编辑器或工作区里)无法用这套方法找回
  • 对象被 gc --prune=now 清理后无法恢复,找回要及时
  • 找回后不挂到分支上,下一次自动清理可能再次把它清掉
  • reflog 也有保留期限,时间过久的记录会被过期清理,别拖太久
  • 在找到的提交上继续操作前不先核对内容,可能把错误的中间状态接回主线

数据来源与参考

  • Git 官方文档:git-fsck(--lost-found)
  • Pro Git 2nd Edition · 10.4 数据恢复
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌