撤销最近一次提交的四种方式
撤销最近提交按需求选:保留改动到暂存区 git reset --soft HEAD^;保留到工作区 git reset HEAD^;彻底丢弃 git reset --hard HEAD^;只想修正内容用 git commit --amend。已推送用 git revert。
看你要"撤销"到什么程度,四种选择:
| 想要的效果 | 命令 |
|---|---|
| 撤销提交,改动回暂存区(马上重提) | git reset --soft HEAD^ |
| 撤销提交,改动回工作区(继续改) | git reset HEAD^(--mixed) |
| 连改动一起丢弃 | git reset --hard HEAD^ |
| 不是撤销,是修正(补文件/改信息) | git commit --amend |
场景对照
# 提交信息写错了 / 漏了文件
git add 漏掉的文件
git commit --amend
# 提交的粒度想重排(拆成几个小提交)
git reset --soft HEAD^
# 逐个 add + commit
# 这个提交压根不该存在,但代码还想留着改
git reset HEAD^
# 这活儿整段白干了
git reset --hard HEAD^
已推送的情况
以上 reset 都只适用于未推送的提交。已推送的用 revert:
git revert HEAD
git push
常见问题(FAQ)
Q:HEAD^ 和 HEAD~1 有区别吗?
对普通提交没区别,都指父提交。merge 提交时 HEAD^ = HEAD^1(第一个父),HEAD~1 沿主线退一步——合并场景下含义才分叉。
Q:撤销后想把改动拆成两个提交?
git reset HEAD^ 后用 git add -p 分批暂存、分批提交。
Q:amend 和 reset --soft 重提有什么区别?
结果一样。amend 是"编辑这个提交"的直达操作,少一步,优先用 amend。