我们有一个名为upgrade
的分支,该分支是6个月前从master
分支出来的。在upgrade
分支中,我们将所有项目重组为maven(master
是ant项目),因此两个分支中的项目x的结构完全不同。
为了将项目重组为Maven,我们使用了git mv
,因此我们保留了历史记录。接下来,我们对upgrade
上的文件进行了一些代码更改,因为升级过程需要这些更改。
现在,我想将master
合并为upgrade
,同时保留upgrade
中存在的所有结构。我该怎么做呢?
我在git merge master
分支上时尝试使用upgrade
。
但这并没有给我们在upgrade
上进行的代码更改带来任何冲突;相反,它使我在属性文件中发生冲突。 (我绝对确定upgrade
上的代码更改与master
冲突)-可能出什么问题了?
最佳答案
您想要的是使用ours
策略(而不是此答案的先前版本中提到的strategy选项);在使用upgrade
时,请使用git merge -s ours master
。根据git merge manpage中更详细的信息,这根本不会尝试进行实际的合并,而只是使用ours
端的树作为结果,并丢弃合并中的所有其他端。
使用merge with将保留所有历史记录,创建一个合并提交(显示历史记录中两个分支的融合),但是使用合并一侧的所有文件。
请注意,“我们的”和“他们的”的含义仅取决于您启动合并时所处的分支(“将升级合并到主服务器”与“将主文件合并到升级”,这两者都会产生相同的结果历史记录) 。 “我们的”是您站立的一个分支,“他们的”是您在merge
命令上指定的分支。有关更多信息,请参见联机帮助页。
编辑:作为解释的要点:您(很可能)在所做的代码更改中没有任何冲突,因为master并未与通用代码库充分不同。默认情况下,git merge
使用三向合并策略,该策略采用要合并的双方的最新共同祖先,并且实际上只查看相对于该共同祖先的更改。如果仅分支的一侧进行了,Git将识别出那里的所有更改都将取代旧代码(在您的情况下为master
上的代码),并且它将仅自动使用upgrade
中的代码(即,它自动解决了“冲突” )。
您必须手动解决的冲突只会在合并的两端与公共(public)祖先相比都发生更改时才会出现。在那种情况下,Git不知道哪一方是“更好”的,甚至可能需要将双方结合起来才能发挥作用。这就是为什么要求用户解决此类冲突的原因。
注意:答案已更新,因为我以前误解了-s和-X选项。