修复'向后'被推送的git merge

时间:2016-03-24 19:50:53

标签: git version-control merge merge-conflict-resolution

我在我的git分支之间遇到了一个问题,我不知道如何处理。我们说我为每个版本都有不同的分支机构。例如,我有' Release-1'和' Release-2'作为我的分支。这些版本本质上是顺序的,即版本2'包含' Release-1中的所有内容,'但不是相反。在我的情况下,我意外地合并了'Release-2'进入' Release-1'在没有意识到我的错误的情况下推动它。一个我意识到我犯了一个错误,我继续发出:

git revert -m 1 <sha-of-bad-merge-commit>

这似乎解决了一切;没有一个&#39; Release-2&#39;代码在&#39; Release-1&#39;一切都显得正确。我把它推到了我的上游,认为它已经解决了。快进到今天。我在“Release-1&#39;”中应用了一个错误修复程序。科。现在,我想合并&#39; Release-1&#39;进入&#39;发布-2,&#39;但是我遇到了困难。 Git认为从之前恢复的变化应该合并到版本2中。从本质上讲,git想要删除&#39; Release-2&#39;意外地被引入了#1; Release-1&#39;来自&#39; Release-2&#39;当我尝试合并。

我已经尝试过研究解决方案而且没有找到解决方案。我发现最接近的应用是过早合并,还原,然后再尝试再次合并。解决方案是还原还原,然后再次进行合并。在这种情况下,我不认为这会有效,因为这会将更改重新引入“版本1”和“版本1”中。这并不意味着在发行版1中。&#39;

除了逐行查看每个受影响的文件以选择正确的更改集之外,是否有一个好的基于git的&#39;接近这个的方法?我不想简单地从“Release-2&#39;”中删除更改。有冲突的分支,因为其中一些可能是合法的。另外,我考虑过将bug修复分支合并到Release-2,&#39;但随后问题可能在未来再次出现。我想防止这种情况发生。

以下是对情况的粗略描述:

(Release-2) ---A----B----C---x---x---------*D*
                          \               /
(Release-1) ---x----Y------M---x---^M----Z

假设A,B和C是我想要的正常提交&#39; Release-2。&#39; &#39; Release-1&#39;的提示是Y并仅包含&#39; Release-1&#39;工作。承诺&#39; M&#39;是我意外合并提交的地方&#39; C&#39;并承诺&#39; Y&#39;在&#39; Release-1&#39;科。在某些时候,我注意到我的错误并恢复合并(提交&#39; ^ M&#39;)。承诺&#39; Z&#39;然后有我的修补程序。此时我想合并“Release-1&#39;回到&#39; Release-2。&#39;我这样做并最终在&#39; D。&#39; D。这是我遇到问题的地方。基本上,我在D&#39; D&#39;告诉它要删除在&#39; A,&#39;中所做的所有更改&#39; B,&#39;和&#39; C,&#39;这是我不想要的。由于合并恢复,其他文件显示为冲突。例如,我想要的一些文件&#39; Release-2&#39;已被删除&#39; Release-1&#39;当我做了恢复。现在,在&#39; D,&#39; git告诉我存在合并冲突,因为一个分支删除了文件而另一个分支修改了文件。

如果有人有任何建议,我将非常感谢听到他们。谢谢!

1 个答案:

答案 0 :(得分:3)

(我将^M提交称为Mrevert,因为^字符在后面的某些命令中具有特殊含义。)

git merge --abort放弃尝试创建提交D

由于您有一系列提交x--Mrevert--Z,您需要提取xZ的更改,而不是Mrevert&#39 ; s,您需要一个三步过程:

  1. 使用git merge Mrevert^将所有更改拉到Mrevert。 (c^语法表示&#34;提交的父项c&#34;。)
  2. 使用git merge -s ours Mrevert告诉git ^M还原提交的更改已经在您的分支中。 -s ours意味着保留我们的(即Release-2&#39; s)版本的树,而不是打扰任何真正的&#34;合并&#34;。
  3. 使用git merge Z合并来自Z的更改。
  4. 这将产生一个提交图,如:

    (Release-2) ---A----B----C---x---x---M1-----M2------M3
                              \         /      /       /
    (Release-1) ---x----Y------M-------x---Mrevert----Z
    

    如果您执行git diff M1 M2,则会发现M2未对Release-2进行任何更改。