撤消 git 中的多个合并提交

Undoing several merge commits in git

撤消 git 合并时遇到一些问题。发生了什么:

我阅读了一些 Whosebug 问题并在#git 中提出,结果是 运行 git revert -m 1 M3,git revert -m 1 M2 和 git还原-m 1 M1。 D1 很高兴他的更改又回来了。

我现在认为我可以 git 将主题合并到测试版中,但这次选择 git checkout --ours 但我不能,因为什么都没发生。我阅读了 https://www.kernel.org/pub/software/scm/git/docs/howto/revert-a-faulty-merge.txt,但仍然不能 100% 理解所有内容。

我最终 运行 将我所有的主题提交变基为一个提交,然后我可以将其合并到测试版中。

我想知道是否有更简单的方法来解决这个问题?

您无法第二次合并主题的原因是更改已经存在于历史记录中并且 git 没有任何内容可以带入分支。当您执行 git revert 撤消合并时,您创建了新的提交。这些提交与已经完成的合并提交相反。分支 beta 的主题更改已撤消,但提交仍在历史记录中,因此当您再次尝试合并时,没有任何内容可合并。您 "undid" 通过创建一个新的提交来将文件更改回原来的状态。

这就是您的分支现在的样子

    X---D---E---F---M1--M2--M3--R1--R2--R3 beta
   /               /   /   /
  /       X---X---X---X---X topic
 /       /
A---B---C---X---X master

R1、R2 和 R3 是您拥有的合并的还原提交。

更简单的解决方法是让 D2 正确解决合并冲突。当他们检查文件并提交时,来自 D1 的更改被踩踏了。

如果它再次发生,解决它的最佳方法是创建一个正确解决冲突的新提交。只要解决合并冲突的人不使用 -m 选项提交,git 就会附加合并提交中有冲突的文件。然后你就可以使用 git log -p -m {MERGE SHA} {FILE} 并且你可以看到文件中的更改是什么并更正它们。

要从主题中引入更改,您必须手动进行。您可以通过 git diff --name-only beta topic 获取不同文件的列表。然后通过执行 git checkout topic -- <files> 然后提交它们,自己将文件带到测试版。