假设我们有两个提交示例(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 test
和git rebase master
,我发现示例1发生冲突,而示例2没有冲突。
在示例1中,当我重新应用C2
时,我猜Git对C2
,C1
和C0
进行了三向合并,这检测到{{1} "line 222"
上的}与C2
上的"line 22"
不同,并且与基础({{1})上的C1
不同,因此Git将其检查为冲突。
在示例2中,"line 2"
的补丁已包含在C0
中,因此Git跳过了它。但是,当重新应用C2
时,如果Git对master
,C3
和C3
进行了三向合并,则它们会检测到C1
上的C0
与"line 222"
上的C3
和基础("line 22"
上的C1
有所不同,Git应该将其检查为冲突,但实际上Git不会。 >
那么,实际上,Git重定基础如何将重新申请的提交视为冲突?
答案 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
的父级),C1
为master
(--theirs
的顶端) ,并且C2
是 C2' <-- HEAD
/
C0--C1 <-- master
\
C2--C3 <-- test
(正在复制)。复制完成后,我们得到以下内容:
C3
接下来,Git樱桃小食C2
。因此,合并基础为C3
(--ours
的父级),C2'
为--theirs
,而C3
为git diff
。
如果从基础到我们的差异(C2
)与从基础到他们的差异之间的差异(C2'
)触及同一文件的“相同行”,则存在合并冲突。在这种情况下,“相同”包括一行触摸后的一行。因此,将C3
(基础)的内容与C2
和C2'
的每一个进行比较,以查看我们的行中发生了哪些变化(C2
与C3
),并且他们的(C2'
与C2
)。如果我们在生成C2'
时将“他们”更改为第2行,则从C3
到import 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}}。