从git-merge的手册页中,您可以使用许多合并策略.
resolve - 这只能使用3向合并算法解析两个头(即当前分支和你从中拉出的另一个分支).它试图仔细检测纵横交错的合并模糊,并且通常被认为是安全和快速的.
递归 - 这只能使用3向合并算法解析两个磁头.当有多个可用于3向合并的共同祖先时,它会创建共同祖先的合并树,并将其用作3向合并的参考树.据报道,这可以减少合并冲突,而不会因为从Linux 2.6内核开发历史记录中进行的实际合并提交而导致错误合并.此外,这可以检测和处理涉及重命名的合并.这是拉动或合并一个分支时的默认合并策略.
章鱼 - 这解决了两个以上的案例,但拒绝进行需要手动解决的复杂合并.它主要用于将主题分支头捆绑在一起.这是拉动或合并多个分支时的默认合并策略.
我们的 - 这解决了任意数量的头,但合并的结果始终是当前的分支头.它旨在用于取代侧枝的旧发展历史.
子树 - 这是一个修改后的递归策略.当合并树A和B时,如果B对应于A的子树,则首先调整B以匹配A的树结构,而不是读取相同级别的树.这种调整也是对共同的祖先树进行的.
我什么时候应该指定不同于默认值的东西?哪些场景最适合?
我不熟悉决心,但我用过其他人:
递归是非快进合并的默认值.我们都熟悉那一个.
当我有几棵树需要合并时,我已经使用了章鱼.你可以在大型项目中看到这一点,在这些项目中,许多分支机构已经进行了独立开发,并且它们已经准备好整合到一个单独
章鱼分支在一次提交中合并多个头,只要它可以干净地完成.
为了说明,假设您有一个具有master的项目,然后是三个要合并的分支(称为a,b和c).
一系列递归合并看起来像这样(注意第一次合并是快进,因为我没有强制递归):
但是,单个章鱼合并将如下所示:
commit ae632e99ba0ccd0e9e06d09e8647659220d043b9 Merge: f51262e... c9ce629... aa0f25d...
我们==我想拉另一个头,但扔掉所有引入的变化.
这样可以保留分支的历史记录而不会产生任何分支的影响.
(阅读:甚至没有看到这些分支之间的变化.分支刚刚合并,没有对文件进行任何操作.如果你想在另一个分支中合并,每次有问题"我们的文件版本或他们的版本"你可以使用git merge -X ours
)
当您想要将另一个项目合并到当前项目的子目录中时,子树很有用.当您拥有一个库时,您不希望将其包含为子模块.
实际上,如果你想放弃分支带来的变化,你要选择的两个策略是我们的,但是将分支保留在历史记录中,如果要将独立项目合并到超级项目的子目录中(如'git-gui'in',则为子树) git'存储库).
合并两个以上的分支时会自动使用章鱼合并. 解决方法主要是出于历史原因,以及何时受到递归合并策略极端情况的影响.
递归是当前默认的双头策略,但经过一些搜索后我终于找到了一些关于"解析"合并策略的信息.
取自O'Reilly的书籍版本控制与Git(亚马逊)(转述):
最初,"resolve"是Git合并的默认策略.
在交叉合并的情况下,有多个可能的合并基础,解决策略的工作方式如下:选择一个可能的合并基础,并希望最好.这实际上没有它听起来那么糟糕.事实证明,用户一直在处理代码的不同部分.在这种情况下,Git检测到它正在重新出现已经存在的一些更改并跳过重复的更改,从而避免冲突.或者,如果这些是导致冲突的轻微变化,至少冲突应该很容易让开发人员处理..
我使用默认递归策略失败的"resolve"成功合并了树.我收到了fatal: git write-tree failed to write a tree
错误,感谢这篇博文(镜像),我试过"-s resolve",这很有用.我仍然不确定为什么......但我认为这是因为我在两棵树上都有重复的变化,并且正确地"跳过"了它们.