找回悬空提交是什么
误重置、误删分支、误改写提交之后,内容通常并没有立刻消失,只是失去了引用而变成悬空对象。恢复的路径是:先用 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 把它接回应有位置
- 立即提交或推送留底,避免后续清理再把它带走