我在我的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告诉我存在合并冲突,因为一个分支删除了文件而另一个分支修改了文件。
如果有人有任何建议,我将非常感谢听到他们。谢谢!
答案 0 :(得分:3)
(我将^M
提交称为Mrevert
,因为^
字符在后面的某些命令中具有特殊含义。)
请git merge --abort
放弃尝试创建提交D
。
由于您有一系列提交x--Mrevert--Z
,您需要提取x
和Z
的更改,而不是Mrevert
&#39 ; s,您需要一个三步过程:
git merge Mrevert^
将所有更改拉到Mrevert
。 (c^
语法表示&#34;提交的父项c
&#34;。)git merge -s ours Mrevert
告诉git ^M
还原提交的更改已经在您的分支中。 -s ours
意味着保留我们的(即Release-2&#39; s)版本的树,而不是打扰任何真正的&#34;合并&#34;。git merge Z
合并来自Z
的更改。这将产生一个提交图,如:
(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进行任何更改。