自动解决添加/添加合并冲突

时间:2018-10-25 06:24:29

标签: git

我们正在使用

git merge --no-ff -Xignore-all-space -Xours masterBranch

在全自动构建管道中自动刷新某些masterBranch中的集成分支。通过从集成分支(目标分支)获取块,这可以自动解决现有文件中的合并冲突。

但是,如果在两个分支(CONFLICT (add/add): Merge conflict in ...)上都新添加了文件,并且仍然没有自动解决这些问题并停止了合并,则等待合并冲突,以等待手动解决冲突。

  • 在这种情况下,为什么-Xours不仅会从“我们的”分支中取出整个文件,还会与其他冲突一样?
  • 是否可以配置git merge,以便在添加/添加冲突的情况下,确实从“我们的”分支获取文件,而不是停止合并?

(这是git 2.15.0)

1 个答案:

答案 0 :(得分:1)

“添加/添加”冲突是我还没有为其找到好名字的一组冲突的一部分,但我们可以将其称为高级冲突树冲突< / em>。其中还包括重命名/删除重命名/重命名

要了解这意味着什么,请记住git merge的工作原理是:

  • 找到一个合并基础(在两个分支上共享)提交;
  • 将合并基础与每个提示进行比较:照原样,有两个git diff

两个git diff命令的输出表明,某些文件已更改,某些文件已创建,删除或重命名。

这两个差异具有不同的标签(“我们的”和“他们的”,“本地的”和“远程的”,依此类推),但是如果大多数人都附上一个人的名字,则可以更好地概念化它们。 base-vs-ours的更改由Alice进行,而base-vs-irs的更改由Bob进行。

假设Alice和Bob都以一个名为READ.ME的文件开头。爱丽丝必须在更改它的同时将其重命名为README.txt,而鲍勃只是对其进行了更改。要 combine 爱丽丝和鲍勃的更改,Git将同时进行 更改,将文件从READ.ME重命名为README.txt 。这是一个没有冲突的重命名:Git可以从运行的两个git diff中得知,爱丽丝在更改文件时重命名了文件,而鲍勃在更改文件时却保留了文件名。

内部 的更改在此文件中,其名称在爱丽丝方面(但鲍勃的名称已更改)已更改,可能会或可能不会冲突。如果他们发生冲突,-X ours会告诉Git偏好的更改:爱丽丝的或鲍勃的。这些类型的冲突是低级别冲突:在单个文件中,如扫描更高级别的“树”更改(已创建,重命名或删除的文件)后所标识。

不幸的是,Git没有任何论据来告诉它如果发生高级或全树范围的冲突,谁的更改(如果有的话)有利于它。例如,如果Alice Bob都重命名了文件,但Alice重命名了README.txt,而Bob重命名了README.rst,则Git不知道该怎么做。 -X参数被赋予低级文件内合并代码;高级文件创建或重命名或删除的合并代码不使用它。

因此:

  

在这种情况下,为什么-Xours不仅会从“我们的”分支中获取整个文件,还会与其他冲突一样?

这不是-X标志的定义方式。它仅适用于“低级”冲突。

  

是否可以配置git merge,以便在添加/添加冲突的情况下,确实从“我们的”分支中获取文件,而不是中止合并?

不。但是请注意,这不是中止合并:它只是使合并本身因冲突而停止,以寻求某人或比Git聪明的人的帮助。选择不协助Git并中止合并的必须是您的自动化人员。