Git 急救手册:误删、改错、强推覆盖的恢复指南
误删了、改错了、推坏了——先别慌。Git 的容错能力远比想象中强,下面按「症状」给出对应的找回方法,命令可直接复制。
最后更新:2026-10-16
找回丢失的提交(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 预览更稳妥。