git如何自动合并两个分支?

时间:2019-06-13 13:44:32

标签: git

我的问题基于以下示例:https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging

enter image description here

以示例为例:

  1. 在Commit C2中设置变量= 2,然后在C4中更改为变量= 4,然后在C5中更改为变量= 2
  2. 制作一个git merge master <branch of iss53>,得到Merge made by the 'recursive' strategy.
  3. 变量为4。

但是为什么?

我希望:由于祖先将变量设置为2,而commit(iss53)也将变量设置为2,因此合并后的结果应为2。因为公共祖先和最新版本的变量设置为= 2

此行为是否取决于合并策略?

编辑:我忘了提及,我在C3中更改了变量= 3。但是结果是一样的。

2 个答案:

答案 0 :(得分:5)

我不知道您列出的步骤是否逐字逐句地实际发生了什么,但是如果是这样,那么在提交C3中,变量仍然具有值2,实际上,由于提交{ C2分支中的{1}}。然后,您将iss53合并到master中。这带来了Git认为是来自功能分支的更改,该更改是该变量现在具有值4。Git保留了来自iss53的版本,这是我通常期望的行为Git的自动合并算法。

如果两个分支更改了变量的值,则将发生合并冲突。例如,如果在提交master中将变量更改为5,则Git将不知道默认值是哪个版本的真值,因此它不会自动合并,而是将该行标记为合并冲突。 / p>

答案 1 :(得分:1)

按时间顺序更新哪个版本无关紧要。这取决于您要合并的分支的内容以及 common 祖先的内容。

C2说2,C5说2(因此C2没有变化),C4说4(有变化),因此git在合并后将其保持为4。

您可能有一些时髦的场景,例如在C3上将值设置为6,然后在C5上将值设置为2 .....在这种情况下,C2仍然 不变,因此最终结果将为4因为C2和C5之间没有变化(即使中间有变化)。