git rebase master如何将重新申请的提交视为冲突?

时间:2018-10-12 03:27:45

标签: git git-rebase

假设我们有两个提交示例(line 1, line 2...foo文件的内容,这是工作目录中唯一的文件):

示例1:

line 1     line 1
line 2     line 22
line 3     line 3
  C0---------C1 [master]
   \
    C2 [test]
  line 1
  line 222
  line 3

示例2:

line 1     line 1
line 2     line 22
line 3     line 3
  C0---------C1 [master]
   \
    C2--------C3 [test]
  line 1     line 1
  line 22    line 222
  line 3     line 3

我在每个示例上分别运行git checkout testgit rebase master,我发现示例1发生冲突,而示例2没有冲突。

在示例1中,当我重新应用C2时,我猜Git对C2C1C0进行了三向合并,这检测到{{1} "line 222"上的}与C2上的"line 22"不同,并且与基础({{1})上的C1不同,因此Git将其检查为冲突。

在示例2中,"line 2"的补丁已包含在C0中,因此Git跳过了它。但是,当重新应用C2时,如果Git对masterC3C3进行了三向合并,则它们会检测到C1上的C0"line 222"上的C3和基础("line 22"上的C1有所不同,Git应该将其检查为冲突,但实际上Git不会。 >

那么,实际上,Git重定基础如何将重新申请的提交视为冲突?

1 个答案:

答案 0 :(得分:1)

每个提交都由git cherry-pick复制(或好像由--ours复制)。 Cherry-pick是一种合并,其合并基础是要选择的提交的父级,其中HEAD版本是--theirs提交,而C0--C1 <-- master \ C2--C3 <-- test 版本是要选择的提交。因此,鉴于:

git checkout test && git rebase master

和:

C2

Git首先将C2'复制到C3,然后将C3'复制到C2

复制C0时,合并基础为C2--ours的父级),C1master--theirs的顶端) ,并且C2 C2' <-- HEAD / C0--C1 <-- master \ C2--C3 <-- test (正在复制)。复制完成后,我们得到以下内容:

C3

接下来,Git樱桃小食C2。因此,合并基础为C3--ours的父级),C2'--theirs,而C3git diff

如果从基础到我们的差异(C2)与从基础到他们的差异之间的差异(C2')触及同一文件的“相同行”,则存在合并冲突。在这种情况下,“相同”包括一行触摸后的一行。因此,将C3(基础)的内容与C2C2'的每一个进行比较,以查看我们的行中发生了哪些变化(C2C3),并且他们的(C2'C2)。如果我们在生成C2'时将“他们”更改为第2行,则从C3import numpy as np x_train=np.random.randn(46, 224, 224, 1) y=np.repeat(x_train,3,axis=3) print(y.shape) #(46, 224, 224, 3) 的差为空,因此通过从{提取文件来简单地解决合并问题{1}}。