如何撤销还未推送的合并(merge)

撤销未推送的 merge:git reset --hard ORIG_HEAD(ORIG_HEAD 自动记录合并前的位置);或 git log 找到合并前提交再 git reset --hard <哈希>。冲突进行中想退出用 git merge --abort。

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

最快:git reset --hard ORIG_HEAD——Git 在每次危险操作(merge/rebase/pull)前会把原 HEAD 位置存进 ORIG_HEAD,合并刚完成时它就是"合并前"的提交。未推送的合并这样撤销干净利索。

两种方式

# 方式一:ORIG_HEAD 快捷引用
git reset --hard ORIG_HEAD

# 方式二:手动找合并前的提交
git log --oneline        # 找到合并前的提交
git reset --hard a1b2c3d

还在合并冲突中?

未完成的合并不是撤销,是中止:

git merge --abort

验证

git log --oneline --graph -5     # 确认合并提交已消失
git status                        # 工作区应干净

常见问题(FAQ)

Q:ORIG_HEAD 可靠吗?

它只记"最近一次危险操作前"的位置。合并后又做了 rebase/reset,ORIG_HEAD 就变了——所以撤销要趁热,或用方式二显式找哈希。

Q:已经推送了怎么办?

不能用 reset(改写共享历史)。用 git revert -m 1 <合并提交> 做反向合并提交。

Q:合并产生的新文件也会被清掉吗?

reset --hard 会把索引和工作区还原到目标提交,合并引入且目标提交中不存在的已跟踪文件会被移除。无关未跟踪文件通常保留,但阻碍还原目标文件的路径可能被删除;不要再盲目执行 clean。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台