我在我的git分支之间遇到了一个问题,我不知道该如何处理。假设我对我正在处理的每个版本都有独立的分支。例如,我有‘版本-1’和‘发行-2’作为我的分支。这些版本在本质上是连续的,也就是说,'Release-2‘包含在'Release-1’中的所有内容,但不是相反的。在我的例子中,我意外地将'Release-2‘合并到'Release-1’中,并在没有意识到我的错误的情况下推了它。有一次我意识到我犯了一个错误,于是我开始发布:
git revert -m 1 <sha-of-bad-merge-commit>这似乎解决了所有的问题;没有一个'Release-2‘代码在'Release-1’中,而且看起来都是正确的。我把这个推到上游,以为它已经解决了。快到今天。我在“Release-1”分支中应用了一个bug修复程序。现在,我想将'Release-1‘合并到'Release-2’中,但是我遇到了混战。Git认为,以前在还原过程中所做的更改应该合并到“Release-2”中。基本上,当我试图合并时,git想要删除“Release-2”中的更改,这些更改在我试图合并时意外地被引入到“Release-1”中。
我试过研究一个解决方案,但还没有找到。我发现的最近的一次应用于合并太早,恢复,然后试图在稍后的日期再次合并。解决方案是恢复还原,然后再进行合并。我认为这在这种情况下是行不通的,因为这将重新引入“Release-1”中的更改,而这些更改并不是在“Relation-1”中。
除了逐行查看每个受影响的文件以选择正确的更改集之外,是否有一种好的“基于git”的方法来处理此问题?我不想简单地从存在冲突的“Release-2”分支中进行更改,因为其中一些可能是合法的。此外,我还考虑过将bug修复分支合并为“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‘是我意外合并提交'C’和提交'Y‘在'Release-1’分支。在某个时候,我注意到我的错误,并恢复合并(提交'^M')。提交'Z‘然后让我的修补程序在里面。在这一点上,我想将'Release-1‘合并回’Release-2‘我这样做了,最后在D.这就是我的问题所在。本质上,我在'D‘的合并告诉它想要删除'A’,'B‘和'C’中的所有更改,而我不想。由于合并还原,其他文件将显示为冲突。例如,当我进行还原时,我希望在“Release-2”中的一些文件在“Release-1”中被删除。现在,在'D‘,git告诉我有一个合并冲突,因为一个分支删除了文件,另一个修改了文件。
如果有人有任何建议的话,我会非常感激的。谢谢!
发布于 2016-03-24 19:55:09
(我将把您的^M提交称为Mrevert,因为^字符在下面的一些命令中有特殊的含义。)
执行git merge --abort以放弃创建提交D的尝试。
由于您有一系列提交x--Mrevert--Z,并且需要引入x和Z的更改,而不是Mrevert的更改,所以需要三个步骤:
git merge Mrevert^将所有更改拉到Mrevert点。( c^语法意味着“提交c的父级”)。git merge -s ours Mrevert告诉git,来自^M还原提交的更改已经在您的分支中了。-s ours的意思是保留树的(即版本2)版本,而不需要任何真正的“合并”。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不会将任何更改拖到版本2中。
https://stackoverflow.com/questions/36208895
复制相似问题