你什么时候会使用不同的git合并策略?

从git-merge的手册页中,可以使用一些合并策略。

  • 解决scheme – 这只能解决两个头(即当前分支和你从另一个分支)使用3路合并algorithm。 它试图仔细检测交叉融合歧义,被认为是安全和快速的。

  • recursion – 这只能使用3路合并algorithm解决两个头。 当有多个共同的祖先可以用于三路合并时,它将创build一个共同的祖先的合并树,并将其用作三路合并的参考树。 据报道,这会导致更less的合并冲突,而不会导致通过从Linux 2.6内核开发历史logging中进行的实际合并提交所做的testing错误合并。 此外,这可以检测并处理涉及重命名的合并。 这是拉取或合并一个分支时的默认合并策略。

  • 章鱼 – 这解决了两个以上的情况,但拒绝做复杂的合并,需要手动解决。 它主要是用来把主题分支头捆绑在一起。 这是拉取或合并多个分支时的默认合并策略。

  • 我们的 – 这解决了任何数量的头,但合并的结果总是当前的分支头。 它是用来取代分支机构的旧发展历史。

  • 子树 – 这是一个修改的recursion策略。 当合并树A和B时,如果B对应于A的子树,则首先调整B以匹配A的树结构,而不是读取处于同一级别的树。 这个调整也是对共同的祖先树进行的。

什么时候应该指定与默认值不同的内容? 哪些场景最适合?

我不熟悉解决scheme,但是我使用了其他方法:

recursion

recursion是非快速合并的默认值。 我们都熟悉那个。

章鱼

当我有几棵需要合并的树时,我使用了章鱼。 你可以在更大的项目中看到这一点,许多分支机构已经有了独立的发展,并且已经准备好将它们合并为一个头。

一个章鱼分支合并多个头在一个提交,只要它可以做到干净。

为了说明,假设你有一个有主人的项目,然后有三个分支合并(称为a,b和c)。

一系列的recursion合并看起来像这样(注意第一次合并是一个快进,因为我没有强制recursion):

一系列递归合并

但是,单个章鱼合并看起来像这样:

commit ae632e99ba0ccd0e9e06d09e8647659220d043b9 Merge: f51262e... c9ce629... aa0f25d... 

章鱼合并

我们的

我的==我想拉另一个头,但扔掉头引进的所有变化。

这保持了分支的历史,而没有任何分支的影响。

(阅读:甚至没有看到这些分支之间的变化,分支只是合并,没有任何文件,如果你想合并在其他分支,每当有问题“我们的文件版本或他们的版本“你可以使用git merge -X ours

子树

当您想要将另一个项目合并到当前项目的子目录中时,子树很有用。 当你有一个你不想作为子模块包含的库时很有用。

实际上,如果你想放弃分支带来的变化,但是把分支放在历史logging中,并且子树(如果你将独立项目合并到超级项目的子目录中) git'资源库)。

合并两个以上分支时自动使用章鱼合并。 这里的解决主要是出于历史原因,而且当你被recursion合并策略的angular落案件。

“解决”与“recursion”合并策略

recursion是当前默认的双头策略,但经过一番search,我终于find了一些关于“解决”合并策略的信息。

采取从O'Reilly书版本控制与Git ( 亚马逊 )(释义):

本来,“解决”是Git合并的默认策略。

在交叉融合的情况下,如果有多个可能的合并基础,解决策略就是这样的:select一个可能的合并基础,并希望最好。 这实际上并不像听起来那么糟糕。 通常情况下,用户一直在使用代码的不同部分。 在这种情况下,Git会检测到正在重新构build已经存在的一些更改,并跳过重复的更改,避免冲突。 或者,如果这些细微的变化确实会引起冲突,至less冲突对于开发者来说应该是容易的。

我已成功地合并树使用“解决”,失败的默认recursion策略。 我得到fatal: git write-tree failed to write a tree错误,并感谢这个博客文章 ( 镜像 )我试过“-s解决”,这工作。 我仍然不完全确定为什么…但是我认为这是因为我在两棵树上都有重复的变化,并且正确地解决它们。