先看一句保命原则
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 / 版本控制)里,下次手抖时能秒查。