如何撤销已推送的合并提交(merge commit)

撤销已推送的合并提交:git revert -m 1 <合并提交哈希>,-m 1 指定以主线(通常是 main)为基准做反向操作。注意:之后想把该分支重新合回来,需要先 revert 这个 revert 或重建分支提交。

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

用 git revert -m 1 <合并提交哈希>。合并提交有两个父提交,-m 1 告诉 Git"以第一个父(主线,通常是 main)为基准",生成一个撤销整个合并效果的新提交。已推送的历史不能改写,revert 是唯一安全的路。

操作步骤

git log --oneline --graph        # 找到合并提交(Merge branch 'feature-x')
git revert -m 1 a1b2c3d
# 解决可能的冲突后提交
git push

-m 1 的 1 指"第一个父提交"。git show <合并提交> 能看到父提交顺序,一般第一个是合入目标(main)。

大坑:之后想重新合并该分支

revert 合并后,Git 认为该分支的改动"已经合并过"——你修复完想再次合并时,改动不会生效!解决办法二选一:

# 方案一:revert 那个 revert(制造"重新引入"提交)
git revert <之前的revert提交>
git merge feature-x    # 现在能正常合了

# 方案二:feature 分支 rebase 到最新 main,生成新哈希后再合并
git checkout feature-x && git rebase main

常见问题(FAQ)

Q:直接 reset 删掉合并提交强推行不行?

技术上可以(未被别人拉取时),但共享分支强推是协作红线。revert 是正向操作,人人安全。

Q:revert 合并提交为什么经常冲突?

revert 要反向应用的改动面大(整个分支),期间主线又前进了很多,冲突概率高。耐心解,或考虑方案二的 rebase 路线。

Q:-m 参数怎么确认用 1 还是 2?

git log -1 --format='%P' <合并提交> 列出父提交,第一个是 1。对 "merge feature into main" 的提交,1=main 侧——保留它、撤销另一侧。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台