首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用`merge.conflictstyle diff3`时,如何使git合并产生更多的粒度冲突?

当使用`merge.conflictstyle diff3`时,如何使git合并产生更多的粒度冲突?
EN

Stack Overflow用户
提问于 2021-12-15 20:33:17
回答 2查看 97关注 0票数 1

在我看来,我对git的不直观的合并行为(2.31.1版)有问题。让我用一个小玩具回购演示一下。

代码语言:javascript
复制
git init
touch file1
git add file1
git commit -m "Initial commit"
git branch feature

现在,我有了一个带有空文件的commit和两个分支,mainfeature,指向该提交。现在,我将主分支中的文件更改为

代码语言:javascript
复制
line1
line2
line3
line4
line5

并将更改提交给

代码语言:javascript
复制
git add file1
git commit -m "Change file1"

接下来,我去另一家分行

代码语言:javascript
复制
git checkout feature

file1更改为

代码语言:javascript
复制
line1
line2
line
line4
line5

并再次提交更改

代码语言:javascript
复制
git add file1
git commit -m "Change file1"

由此产生的提交树如下所示:

代码语言:javascript
复制
* b1beb63 - Change file1 (HEAD -> feature)
| * 32ea83d - Change file1 (main)
|/
* 2952256 - Initial commit

现在我切换回main分支,并将feature合并到main中。

代码语言:javascript
复制
git checkout main
git config merge.conflictstyle diff3
git merge feature

正如预期的那样,file1中存在冲突。然而,冲突看起来是这样的:

代码语言:javascript
复制
<<<<<<< HEAD
line1
line2
line3
line4
line5
||||||| 2952256
=======
line1
line2
line
line4
line5
>>>>>>> feature

如您所见,git的行为就像整个文件是一个大冲突。我本以为它会是这样的:

代码语言:javascript
复制
line1
line2
<<<<<<< HEAD
line3
||||||| 2952256
=======
line
>>>>>>> feature
line4
line5

这将是无限地更友好的用户。

我发现了一些线程,人们有类似的问题,因为不同的行尾。--这里不是这样的,,因为我用同一个编辑器在同一个平台上编辑了两个分支中的文件。

这类合并的当前解决方案是通过在两个分支(即git diff main:file1 feature:file1 )之间对文件执行不同的操作来手动查找更改。这是可行的,但相当烦人。

有什么方法可以得到我在这次合并中期望的行为吗?如果没有,有什么很好的理由不能这样做吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-11 16:38:48

GIT2.35.0将有一种新的冲突样式,它的行为与这里所希望的完全相同,称为zdiff3。它可以使用git config merge.conflictstyle zdiff3进行配置。添加--global以全局配置冲突样式。

我用git版本的2.35.0.rc0对它进行了测试,它产生了以下结果。

代码语言:javascript
复制
line1
line2
<<<<<<< HEAD
line3
||||||| 59df1b4
=======
line
>>>>>>> feature
line4
line5

太棒了!

票数 2
EN

Stack Overflow用户

发布于 2021-12-15 21:11:22

tl;博士,您期望的行为是冲突的无效diff3表示。你不能两者兼得。

最初的提交令人痛苦地详细解释。。我试着总结一下。

让我们看看你的案子。你从这个开始。

代码语言:javascript
复制
# ancestor

# main
line1
line2
line3
line4
line5

# feature
line1
line2
line
line4
line5

你要求对所有三个文件进行区分,这就是你得到的。

代码语言:javascript
复制
<<<<<<< HEAD
line1
line2
line3
line4
line5
||||||| 2952256
=======
line1
line2
line
line4
line5
>>>>>>> feature

原始文件为空白。头把它改为增加了五行。功能增加了五行。这是对三方冲突的正确表述。

让我们看看你期望看到的..。

代码语言:javascript
复制
line1
line2
<<<<<<< HEAD
line3
||||||| 2952256
=======
line
>>>>>>> feature
line4
line5

这表明原始文件包含4行。HEAD和feature在line2和line4之间增加了一条线。

换句话说,它说你合并了这些文件。

代码语言:javascript
复制
# ancestor
line1
line2
line4
line5

# main
line1
line2
line3
line4
line5

# feature
line1
line2
line
line4
line5

那不是真的,祖先是空白的。

减少你想要的是好的双向冲突标记,但将击败点的3路冲突标记。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70369970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档