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