撤销最近一次提交的四种方式

撤销最近提交按需求选:保留改动到暂存区 git reset --soft HEAD^;保留到工作区 git reset HEAD^;丢弃跟踪改动 git reset --hard HEAD^;只想修正内容用 git commit --amend。已推送用 git revert。

最佳实践
Git 提交历史与版本恢复示意

看你要"撤销"到什么程度,四种选择:

想要的效果 命令
撤销提交,改动回暂存区(马上重提) 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。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台