我们正在使用
git merge --no-ff -Xignore-all-space -Xours masterBranch
在全自动构建管道中自动刷新某些masterBranch中的集成分支。通过从集成分支(目标分支)获取块,这可以自动解决现有文件中的合并冲突。
但是,如果在两个分支(CONFLICT (add/add): Merge conflict in ...
)上都新添加了文件,并且仍然没有自动解决这些问题并停止了合并,则等待合并冲突,以等待手动解决冲突。
-Xours
不仅会从“我们的”分支中取出整个文件,还会与其他冲突一样?git merge
,以便在添加/添加冲突的情况下,确实从“我们的”分支获取文件,而不是停止合并?(这是git 2.15.0)
答案 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并中止合并的必须是您的自动化人员。