16.6 合并策略

Git合并操作支持很多合并策略,默认会选择最适合的合并策略。例如,和一个分支进行合并时会选择recursive合并策略,当和两个或两个以上的其他分支进行合并时采用octopus合并策略。可以通过传递参数使用指定的合并策略,命令行如下:


git merge[-s<strategy>][-X<strategy-option>]<commit>…


其中参数-s用于设定合并策略,参数-X用于为所选的合并策略提供附加的参数。

下面分别介绍不同的合并策略:

(1)resolve

该合并策略只能用于合并两个头(即当前分支和另外的一个分支),使用三向合并策略。这个合并策略被认为是最安全、最快的合并策略。

(2)recursive

该合并策略只能用于合并两个头(即当前分支和另外的一个分支),使用三向合并策略。这个合并策略是合并两个头指针时的默认合并策略。

当合并的头指针拥有一个以上的祖先的时候,会针对多个公共祖先创建一个合并的树,并以此作为三向合并的参照。这个合并策略被认为可以实现冲突的最小化,而且可以发现和处理由于重命名导致的合并冲突。

这个合并策略可以使用下列选项。

ours

在遇到冲突的时候,选择我们的版本(当前分支的版本),而忽略他人的版本。如果他人的改动和本地改动不冲突,会将他人的改动合并进来。

不要将此模式和后面介绍的单纯的ours合并策略相混淆。后面介绍的ours合并策略直接丢弃其他分支的变更,无论冲突与否。

theirs

和ours选项相反,遇到冲突时选择他人的版本,丢弃我们的版本。

subtree[=path]

这个选项使用子树合并策略,比下面介绍的subtree(子树合并)策略的定制能力更强。下面的subtree合并策略要对两个树的目录移动进行猜测,而recursive合并策略可以通过此参数直接对子树目录进行设置。

(3)octopus

可以合并两个以上的头指针,但是拒绝执行需要手动解决的复杂合并。主要的用途是将多个主题分支合并到一起。这个合并策略是对三个及三个以上的头指针进行合并时的默认合并策略。

(4)ours

可以合并任意数量的头指针,但是合并的结果总是使用当前分支的内容,丢弃其他分支的内容。

(5)subtree

这是一个经过调整的recursive策略。当合并树A和B时,如果B和A的一个子树相同,B首先进行调整以匹配A的树的结构,以免两棵树在同一级别进行合并。同时也针对两棵树的共同祖先进行调整。

关于子树合并会在第4篇的第24章“子树合并”中详细介绍。