版本控制

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 / 版本控制)里,下次手抖时能秒查。