Git 撤销提交指南
什么时候用
你已经做了 git commit,现在想撤销提交,但具体应该用哪条命令,取决于两个问题:
- 这个提交是否已经推送到远程。
- 你是否还想保留本地代码改动。
先判断当前状态
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>