Git:合并具有非常不同结构的分支

时间:2012-12-26 22:21:10

标签: git version-control github repository git-svn

我们有一个名为upgrade的分支,在6个月前分支master。在upgrade分支中,我们将所有项目重组为maven(master是蚂蚁项目),因此两个分支中项目x的结构完全不同。

要将项目重组为maven,我们使用了git mv,因此我们保留了历史记录。接下来,我们对upgrade上的文件进行了一些代码更改,因为升级过程需要进行更改。

现在我想将master合并到upgrade,同时保留upgrade中存在的所有结构。我该怎么做?

我在git merge master分支上尝试使用upgrade

但这并没有对我们在upgrade上所做的代码更改产生任何冲突;相反,它给了我属性文件中的冲突。 (我确定upgrade上的代码更改与master冲突) - 可能出错?

1 个答案:

答案 0 :(得分:2)

您想要的是使用ours策略(而不是本答案前一版本中提到的策略选项);在upgrade上时,请使用git merge -s ours master。根据{{​​3}}中的更详细信息,这根本不会尝试进行实际合并,而只是使用ours侧的树来获取结果并丢弃合并中的每个其他方面

使用merge将保留所有历史记录,创建合并提交(显示历史记录中两个分支的收敛),但使用合并一侧的所有文件。

请注意,“我们的”和“他们的”的含义仅取决于您在启动合并时所处的分支(“合并升级为主”与“合并主升级到升级”,两者都产生相同的结果历史)。 “我们的”是您所站立的一个分支,“他们的”是您在merge命令中指定的分支。有关这方面的更多信息将在联机帮助页中进行说明。

编辑:作为解释点:您(很可能)没有对您所做的代码更改产生任何冲突,因为master与公共代码库没有充分分歧。默认情况下,git merge使用三向合并策略,该策略采用您要合并的双方的最新共同祖先,并且仅实际查看相对于该共同祖先的更改。如果只有分支的一方进展,Git会认识到所有更改都会取代旧代码(在您的情况下,master上的代码),它将自动使用upgrade中的代码(即它自动解决了“冲突”。

只有当合并的两侧与共同祖先相比发生了变化时,才能手动解决冲突。在这种情况下,Git不知道哪一方“更好” - 甚至可能是双方需要合并才能发挥作用。这就是为什么要求用户解决此类冲突的原因。

注意:答案已更新,因为我之前误解了-s和-X选项。