如何在 Git 中恢复合并提交而不重写历史记录
合并提交有两个父项,因此 Git 需要知道保留哪一边。以下是如何选择父级、在共享分支上安全地撤消合并以及稍后恢复工作。
撰写者 Kodmora
GitTree 背后的软件公司
- 合并
- 撤消和恢复
- 提交历史
在此页面上
要恢复合并提交,请运行 `git revert -m 1 <merge-commit>`。 -m 1 告诉 Git 保留第一个父分支(您合并到的分支),并撤消合并引入的所有内容。Git 添加新提交,因此历史记录保持完整,并且修复可以安全地推送到共享分支。
如何恢复合并提交?
首先找到合并提交。该图将其显示为两个父母的提交:
git log --oneline --graph -10然后确认其父母。提交后打印的第一个哈希值是父级 1,第二个是父级 2:
git log -1 --format="%h parents: %p" <merge-commit>恢复它,保留父级 1,并像其他提交一样推送新提交:
git revert -m 1 <merge-commit>
git push没有任何内容被重写,因此没有人需要重置或强制拉取。如果恢复冲突,请修复文件、暂存它们并运行 git revert --continue。要退出,请运行 git revert --abort。
为什么 Git 说“提交是合并但没有给出 -m 选项”?
正常的提交有一个父提交,因此其差异很明显。合并提交有两个,因此 git revert <merge-commit> 无法判断您要返回到哪一侧。 Git 因此错误而停止并且不进行任何更改:
error: commit 4f2a9c1 is a merge but no -m option was given.
fatal: revert failed添加带有父编号的 -m 并再次运行。
我应该使用 -m 1 还是 -m 2?
| 选项 | 保持 | 当 |
|---|---|---|
-m 1 | 您合并到的分支,例如 main | 一项功能已合并,应删除。这是通常的情况。 |
-m 2 | 被合并的分支 | 您将 main 拉入功能分支,并希望删除来自 main 的内容。 |
恢复后如何再次合并同一分支?
这就是陷阱。正如 Git 文档所说,恢复合并“声明您永远不会希望合并带来的树更改”。该分支的提交仍然是 main 的祖先,因此第二个 git merge 仅带来恢复后所做的提交。
要恢复原始工作,请先恢复恢复,然后合并固定分支:
git revert <revert-commit>
git merge feature/search如果合并还没有推送怎么办?
您可以删除合并而不是添加还原。 Git 在 ORIG_HEAD 中记录合并之前的提交,并且 --merge 拒绝触及重置将覆盖的不相关的本地编辑:
git reset --merge ORIG_HEAD如果合并仍在进行中并且存在冲突,则还没有合并提交,因此请使用 git merge --abort。如果您做得太过分,请阅读如何撤消重置、变基或提交,并阅读有关在共享历史记录上还原与重置 的课程,了解此选择背后的规则。
如何恢复 GitTree 中的合并提交
打开提交的菜单
在提交图中找到合并并右键单击它。
选择恢复提交
合并有两个父级,因此 GitTree 询问要根据哪一个进行衡量:第一个父级(合并到的分支) 是通常的选择,而 第二个父级(合并到的分支) 是另一个。
检查结果
GitTree 表示 Reverted. 并且新提交位于分支的顶行。如果发生冲突,请解决文件并按 继续,或 中止... 返回。
请参阅 GitTree 中的择优挑选和还原以获取完整指南,包括一次提交多个提交。

常见问题
git revert 会删除合并提交吗?
不会。合并将留在历史中。 Git 添加了一个新的提交来撤消其更改,这就是为什么它在共享分支上是安全的。
git revert 中 -m 1 是什么意思?
它命名要保留的主线父级。父级 1 是您运行合并时所在的分支,因此 -m 1 会删除其他分支引入的内容。
我可以恢复已推送的合并吗?
是的,它是正确的工具。恢复会添加提交,因此您可以正常推送,而无需重写任何内容。
为什么我的第二次合并没有带来任何结果?
恢复的分支的提交已经在历史记录中,因此 Git 将它们视为合并。恢复恢复提交,然后再次合并。
如何撤消仍在进行中的合并?
运行git merge --abort。它会停止合并并将文件返回到开始合并之前的状态。
来源
有关其他产品的声明已根据其位于 2026年11月7日 的官方页面进行了检查。价格和功能发生变化;供应商的页面是事实的来源。