版本控制

Git 事故恢复实战:提交写错、推错分支、误删分支怎么救

日常协作里最慌的时刻往往是「完蛋,提交/分支搞错了」。本文按真实事故场景给出可立即照做的恢复命令,并讲清每条命令的安全边界,覆盖提交改写、误推与误删分支的完整救火流程。

作者:巧匠团队·8 分钟阅读·更新于 2026-08-24

先看一句保命原则

99% 的 Git 事故都能救,因为 Git 几乎不真正删除任何东西——提交一旦创建就留在对象库里,只是没有了引用。

慌的时候先别急着 git push --force 或 git reset --hard,先 git status 看清现状,再用下面的命令按场景处理。

git status
# 看清当前分支、工作区与暂存区状态,再决定下一步

场景一:最后一次提交写错(还没推送)

只改提交信息:git commit --amend。想保留改动但重做提交:--soft 撤销提交、改动留在暂存区;--mixed(默认)改动退回工作区;--hard 直接丢弃,慎用。

git commit --amend                 # 修改最后一次提交信息/内容
git reset --soft HEAD~1            # 撤销提交,改动留在暂存区
git reset --hard HEAD~1           # 彻底丢弃最后一次提交与改动(慎用)

场景二:已经推送到共享分支

已推送的提交**不要**用 reset + force,会改写他人历史。正确做法是用 git revert 生成一个「反向提交」来抵消某次改动,安全可推。

git revert <sha>                  # 生成反向提交,安全抵消某次改动
git push                          # 推送到共享分支,不破坏他人历史

场景三:分支/提交误删,怎么找回

HEAD 的每一次移动都记录在 git reflog 里,哪怕分支被删,提交对象还在。找到目标提交的 sha,用 git checkout <sha> 或 git branch <new> <sha> 复活它。

git reflog                       # 查看 HEAD 移动历史,找到丢失的 sha
git branch recovered <sha>        # 用丢失的 sha 重建一个分支

场景四:改了半天发现改错了分支

不要急着重做。用 git stash 把当前改动收起来,切到正确分支再 git stash pop 恢复;若部分提交已经做完,用 git cherry-pick 把那几个提交挪过去。

git stash                        # 暂存当前改动
git switch correct-branch        # 切到正确分支
git stash pop                    # 恢复改动
# 或仅搬运个别提交:
git cherry-pick <sha>

出事后的自救清单

① 先 git status 别乱动;② 未推送用 reset/amend,已推送用 revert;③ 误删用 reflog 找回;④ 改错分支用 stash/cherry-pick;⑤ 任何 --hard / --force 前确认没有他人依赖。

把这些命令存进对应的速查表(Git / 版本控制)里,下次手抖时能秒查。

官方参考来源

下方为命令对应的官方权威文档,供你核对最新用法与深入查阅。