Hen*_*ing 3 git git-merge diff3
git mergemerge.conflictStyle考虑合并冲突情况下的设置。可能的值为merge(默认)和diff3。
我注意到diff3有时会产生更大的冲突(参见下面的示例)。我找到了这篇论文,它diff3非常详细地描述了该算法,但我找不到太多关于默认merge算法的信息。
merge和算法之间的确切区别是什么diff3?默认merge算法到底是如何工作的?
我有这些文件:
1
2
3
Run Code Online (Sandbox Code Playgroud)
1
change1
change2
input1OnlyChange1
change3
change4
change5
change6
input1OnlyChange2
change7
change8
change9
2
3
Run Code Online (Sandbox Code Playgroud)
1
change1
change2
input2OnlyChange1
change3
change4
change5
change6
input2OnlyChange2
change7
change8
change9
2
3
Run Code Online (Sandbox Code Playgroud)
我得到merge2 个冲突标记:
1
change1
change2
<<<<<<< HEAD
input1OnlyChange1
=======
input2OnlyChange1
>>>>>>> input2
change3
change4
change5
change6
<<<<<<< HEAD
input1OnlyChange2
=======
input2OnlyChange2
>>>>>>> input2
change7
change8
change9
2
3
Run Code Online (Sandbox Code Playgroud)
然而,diff3我只得到 1 个冲突标记:
1
<<<<<<< HEAD
change1
change2
input1OnlyChange1
change3
change4
change5
change6
input1OnlyChange2
change7
change8
change9
||||||| 0fcee2c
=======
change1
change2
input2OnlyChange1
change3
change4
change5
change6
input2OnlyChange2
change7
change8
change9
>>>>>>> input2
2
3
Run Code Online (Sandbox Code Playgroud)
这是我的测试脚本(powershell):
rm -Force -r ./repo -ErrorAction Ignore
mkdir ./repo
cd ./repo
git init
# git config merge.conflictStyle diff3
cp ../../base.txt content.txt
git add *; git commit -m first
git branch base
git checkout -b input2
cp ../../input2.txt content.txt
git add *; git commit -m input2
git checkout base
cp ../../input1.txt content.txt
git add *; git commit -m input1
git merge input2
Run Code Online (Sandbox Code Playgroud)
该merge算法是否会再次比较差异以分解更大的冲突?显然,该merge算法还执行某种三向比较,因为当您更新base为 match时不会发生冲突yours。
文档是这样说的:
指定合并时将冲突块写入工作树文件的样式。默认值为“合并”,它显示
<<<<<<<冲突标记、一侧所做的更改、一个=======标记、另一侧所做的更改,然后是一个>>>>>>>标记。另一种样式“diff3”在标记之前添加|||||||标记和原始文本=======。
显然,这并不能解释示例中观察到的差异。
是的,尤其是当双方都添加了一些以前没有的东西,但他们添加了不同的东西(显然,因此发生冲突)时,就会出现这种情况。
\n\n\n显然,这并不能解释示例中观察到的差异
\n
事实上,我认为确实如此。在两部分合并冲突显示样式中,我们只是将我们的与他们的进行对比,因此相同内容的区域不会显示为冲突的一部分。但在三部分 diff3 合并冲突显示样式中,我们通过将我们的与基础的以及他们的与基础的进行比较来显示冲突;在 base 为“无”的情况下(如此处所示),这意味着我们的显示块和他们的显示块都必须包含整个插入的材料。
\n从实际的角度来看,当将其视为 diff3 \xe2\x80\x94 时,这使得人类解决冲突变得更加困难,事实上,我所做的是以另一种方式重新比较它,比较我们的块与他们的大块头对抗,帮助我“发现差异”,需要思考。您可以通过说 来在冲突中交换显示样式git checkout --conflict <diff3|merge> <filepath>。
附录考虑到您的评论,我认为您可能在这里存在误解。merge/diff3 的区别不会影响合并的工作方式或是否存在冲突。考虑到存在冲突,它所影响的是它在单文件标记中的显示方式。
\n