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

Ros*_*ose 7 git version-control github git-svn repository

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

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

现在我想合并masterupgrade同时保留所有结构upgrade.我该怎么做呢?

git merge masterupgrade分支上尝试使用.

但这并没有让我对我们所做的代码更改产生任何冲突upgrade; 相反,它给了我属性文件中的冲突.(我肯定肯定代码更改与upgrade此冲突master) - 可能是什么错误?

Nev*_*nel 3

您想要的是使用ours策略(而不是本答案的先前版本中提到的策略选项);开启时upgrade,使用git merge -s ours master. 根据git merge 手册页中的更详细信息,这根本不会尝试进行实际合并,而是简单地使用侧面的树ours作为结果,并丢弃合并中的所有其他侧面。

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

请注意,“我们的”和“他们的”的含义仅取决于您启动合并时所在的分支(“将升级合并到主版本”与“将主版本合并到升级版本”,两者都会产生相同的结果历史记录) 。“我们的”是您站在的一个分支,“他们的”是您在merge。有关此内容的更多信息在联机帮助页中进行了解释。

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

仅当合并双方与共同祖先相比发生更改时,才会出现必须手动解决的冲突。在这种情况下,Git 不知道哪一侧“更好”——甚至可能需要将两侧结合起来才能工作。这就是为什么要求用户解决此类冲突。

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