跳至内容
GitTree
Git 指南阅读 1 分钟

如何在 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 中的合并提交

  1. 打开提交的菜单

    在提交图中找到合并并右键单击它。

  2. 选择恢复提交

    合并有两个父级,因此 GitTree 询问要根据哪一个进行衡量:第一个父级(合并到的分支) 是通常的选择,而 第二个父级(合并到的分支) 是另一个。

  3. 检查结果

    GitTree 表示 Reverted. 并且新提交位于分支的顶行。如果发生冲突,请解决文件并按 继续,或 中止... 返回。

请参阅 GitTree 中的择优挑选和还原以获取完整指南,包括一次提交多个提交。

GitTree 图中的提交菜单提供对任何提交(包括合并提交)的“恢复提交”。
GitTree 图中的提交菜单提供对任何提交(包括合并提交)的“恢复提交”。

常见问题

git revert 会删除合并提交吗?

不会。合并将留在历史中。 Git 添加了一个新的提交来撤消其更改,这就是为什么它在共享分支上是安全的。

git revert 中 -m 1 是什么意思?

它命名要保留的主线父级。父级 1 是您运行合并时所在的分支,因此 -m 1 会删除其他分支引入的内容。

我可以恢复已推送的合并吗?

是的,它是正确的工具。恢复会添加提交,因此您可以正常推送,而无需重写任何内容。

为什么我的第二次合并没有带来任何结果?

恢复的分支的提交已经在历史记录中,因此 Git 将它们视为合并。恢复恢复提交,然后再次合并。

如何撤消仍在进行中的合并?

运行git merge --abort。它会停止合并并将文件返回到开始合并之前的状态。

来源

有关其他产品的声明已根据其位于 2026年11月7日 的官方页面进行了检查。价格和功能发生变化;供应商的页面是事实的来源。