Git 急救手册:误删、改错、强推覆盖的恢复指南

误删了、改错了、推坏了——先别慌。Git 的容错能力远比想象中强,下面按「症状」给出对应的找回方法,命令可直接复制。

最后更新:2026-10-16

Git 命令速查表 →

找回丢失的提交(reflog)

只要提交过的内容,默认 90 天内几乎都能找回来。Git 的 reflog 记录了 HEAD 的每一次移动:

# 查看最近的 HEAD 移动记录
git reflog

# 输出示例(左侧为提交哈希)
# a1b2c3d HEAD@{0}: commit: 添加搜索功能
# e4f5g6h HEAD@{1}: reset: moving to HEAD~2

# 从目标提交重建分支(推荐,不动当前分支)
git branch recover-feature a1b2c3d

# 或让当前分支直接指回该提交
git reset --hard a1b2c3d

原理:reflog 默认保留 90 天(gc.reflogExpire),期间悬空提交不会被垃圾回收。

恢复误删的分支

# 从 reflog 找到分支最后的提交位置
git reflog

# 用该哈希重建分支
git branch feature-x a1b2c3d

# reflog 也找不到?搜索悬空提交
git fsck --lost-found

好习惯:删除分支时 Git 会输出 Deleted branch feature-x (was a1b2c3d),随手记下这个哈希最保险。

撤销 git reset --hard

reset --hard 只是移动分支指针,提交对象仍留在本地仓库:

git reflog                       # 找到 reset 之前的提交
git reset --hard HEAD@{1}        # 整体回到 reset 前的状态

# 只想恢复部分文件?
git checkout HEAD@{1} -- path/to/file

边界:仅对本地未推送的操作有效;提交已 push 到共享分支时,用 git revert 撤销更安全。

改错提交信息 / 漏提交文件

# 修改最后一次提交的信息
git commit --amend -m "正确的提交信息"

# 漏了文件?追加进最后一次提交,不产生新提交
git add forgotten.txt
git commit --amend --no-edit

# 已 push 的提交要修改,需强制更新(确认没人在此分支上开发)
git push --force-with-lease origin main

原则:--amend 只用于尚未共享的提交;改公共分支的历史会让协作者混乱。

提交到了错误的分支

# 场景:本应提交到 feature 的代码,提交到了 main
git branch feature-x             # 1. 在当前位置建分支,提交不丢
git reset --hard HEAD~1          # 2. main 退回上一个提交
git switch feature-x             # 3. 切到新分支继续开发

# 只想把某一个提交搬到另一分支:cherry-pick
git switch feature-x
git cherry-pick a1b2c3d          # 把该提交复制过来
git switch main
git reset --hard HEAD~1          # 再从 main 上移除

合并冲突:别慌

# 查看哪些文件存在冲突
git status

# 手动编辑解决后,标记并完成合并
git add <file>
git commit

# 搞砸了想重来?
git merge --abort                 # 放弃本次合并,回到合并前
git rebase --abort                # rebase 同理

进阶:git config --global merge.conflictstyle diff3 会在冲突块中显示共同祖先,更容易判断双方各改了什么。

force push 事故与恢复

自己强推覆盖了别人,或被别人的强推覆盖——被覆盖的提交通常还留在某台机器的 reflog 里:

# 在还有旧提交的机器上(你的或协作者的)
git reflog
git branch rescue a1b2c3d         # 先抢救成分支

# 服务器端一般不会立即 GC,可联系管理员
# 或到平台的事件流(如 GitHub Events)查 force push 前的哈希

预防:永远用 --force-with-lease 替代 --force——远程有别人的新提交时会拒绝推送,从源头避免覆盖。

git clean 误删未跟踪文件

这是 Git 唯一几乎无法找回的操作——未跟踪文件从未进入对象库:

# 永远先 dry-run,看清将删除什么
git clean -nd

# 确认无误再真正删除
git clean -fd

# 重要未跟踪文件?先 stash(含 -u 才包含未跟踪)
git stash -u                      # 随时可恢复

预防:把 git clean 想象成 rm -rf 级别操作;日常清理依赖目录用 git clean -ndx 预览更稳妥。

Git 的容错能力远比想象中强——只要提交过一次,绝大多数「事故」都能靠 reflog 找回。真正无法挽回的只有 git clean 删掉的未跟踪文件,所以先预览、再执行。

回到 Git 知识宝典 查看完整交互版,或直接打开 Git 命令速查表。