跳到主要内容

Git 撤销提交指南

什么时候用

你已经做了 git commit,现在想撤销提交,但具体应该用哪条命令,取决于两个问题:

  1. 这个提交是否已经推送到远程。
  2. 你是否还想保留本地代码改动。

先判断当前状态

git status -sb
git log --oneline --decorate -5
git branch -vv
  • git status -sb 适合快速看当前分支和 ahead/behind 状态。
  • git log --oneline --decorate -5 先确认你到底要撤销哪一个提交。
  • git branch -vv 可以辅助判断当前分支是否已经跟踪远程分支。

推荐命令

情况推荐命令结果
提交还没推送,但想保留为“已暂存”状态git reset --soft HEAD~1提交消失,改动仍在暂存区
提交还没推送,但想保留为“未暂存”编辑状态git reset --mixed HEAD~1提交消失,改动留在工作区
提交还没推送,连代码也不要了git reset --hard HEAD~1提交和本地改动一起丢弃
提交已经推送,或者别人可能基于它开发git revert <commit>新建一个反向提交,不改写历史

git reset HEAD~1 默认就是 --mixed

常见场景

撤销最后一次本地提交,但保留代码

git reset --soft HEAD~1

适合刚提交完就发现提交信息写错、文件少了,准备重新提交的情况。

撤销最后一次本地提交,并回到继续编辑状态

git reset --mixed HEAD~1

撤销最近 3 次本地提交

git reset --soft HEAD~3

如果你已经推送到了“只由你维护的个人分支”,并且明确要改写远程历史,后续可以再执行:

git push --force-with-lease origin $(git branch --show-current)

撤销已经推送出去的提交

git revert <commit>

更完整的说明见 Git revert 指南

风险与边界

  • git reset 会移动当前分支指针,属于改写历史。
  • git reset --hard 会直接覆盖工作区和暂存区,风险最高。
  • 对共享分支、公共分支或他人可能已经拉取的历史,不要默认使用 reset 后强推,优先 git revert
  • 如果误用了 reset,很多情况下还能用 git reflog 找回本地历史。

相关命令

git reflog
git commit --amend
git revert HEAD
git push --force-with-lease origin <branch>