【发布时间】:2016-07-12 13:22:52
【问题描述】:
我在我的 git 分支之间遇到了一个问题,我不确定如何解决。假设我正在处理的每个版本都有单独的分支。例如,我有“Release-1”和“Release-2”作为我的分支。这些版本本质上是连续的,即“Release-2”包含“Release-1”中的所有内容,但反之则不然。就我而言,我不小心将“Release-2”合并到“Release-1”中,并在没有意识到我的错误的情况下将其推送。我意识到我犯了一个错误,我继续发布:
git revert -m 1 <sha-of-bad-merge-commit>
这似乎解决了一切; 'Release-2' 代码都没有在'Release-1' 中,并且看起来都是正确的。我把它推到我的上游,认为它已经解决了。快进到今天。我在“Release-1”分支中应用了错误修复。现在,我想将“Release-1”合并到“Release-2”中,但我遇到了冲突。 Git 认为从之前的 revert 中所做的更改应该合并到“Release-2”中。本质上,当我尝试合并时,git 想要从 'Release-2' 中删除意外引入到 'Release-1' 中的更改。
我已尝试研究解决方案,但没有找到。我发现最接近的方法适用于过早合并、还原,然后尝试在以后再次合并。解决方案是还原还原,然后再次进行合并。我不认为这在这种情况下会起作用,因为这会将不应该在“Release-1”中的更改重新引入“Release-1”。
除了逐行查看每个受影响的文件以选择正确的更改集之外,是否有一种好的“基于 git”的方法来解决这个问题?我不想简单地从存在冲突的“Release-2”分支中获取更改,因为其中一些可能是合法的。另外,我考虑过将错误修复分支合并到“Release-2”,但将来可能会再次出现问题。我想防止这种情况发生。
这是一个粗略的情况:
(Release-2) ---A----B----C---x---x---------*D*
\ /
(Release-1) ---x----Y------M---x---^M----Z
假设 A、B 和 C 是我想要的“Release-2”的正常提交。 “Release-1”的提示是 Y,只包含“Release-1”的作品。提交'M'是我不小心在'Release-1'分支中合并提交'C'和提交'Y'的地方。在某些时候,我注意到我的错误并恢复合并(提交'^M')。提交'Z'然后有我的修补程序。此时,我想将“Release-1”合并回“Release-2”。我这样做并最终获得'D'。这就是我的问题所在。本质上,我在“D”处的合并告诉它想要删除在“A”、“B”和“C”中所做的所有更改,这是我不想要的。由于合并还原,其他文件显示为冲突。例如,当我进行还原时,我想要在“Release-2”中的一些文件在“Release-1”中被删除。现在,在“D”处,git 告诉我存在合并冲突,因为一个分支删除了文件,而另一个分支修改了文件。
如果有人有任何建议,我将不胜感激。谢谢!
【问题讨论】:
标签: git version-control merge merge-conflict-resolution