撤销最近一次提交的四种方式
撤销最近提交按需求选:保留改动到暂存区 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 --mixed HEAD^
# 逐个 add + commit
# 这个提交压根不该存在,但代码还想留着改
git reset HEAD^
# 这活儿整段白干了
git reset --hard HEAD^
HEAD^ 要求有父提交,根提交不能直接照搬。hard 会丢跟踪改动且可能删除阻挡检出的未跟踪路径;未推送到某个远端也不自动证明无人依赖。
已推送的情况
以上 reset 都只适用于未推送的提交。已推送的用 revert:
git revert HEAD
git push
常见问题(FAQ)
Q:HEAD^ 和 HEAD~1 有区别吗?
只要父提交存在,二者始终都指第一父提交,合并时也不分叉;HEAD^2 才是第二父,HEAD~2 是第一父链两代。
Q:撤销后想把改动拆成两个提交?
git reset HEAD^ 后用 git add -p 分批暂存、分批提交。
Q:amend 和 reset --soft 重提有什么区别?
不完全一样:amend 通常保留作者/author date 及原父列表(含合并父),soft reset 后普通 commit 可能不同。amend 是"编辑这个提交"的直达操作,少一步,优先用 amend。