首页 文章

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

提问于
浏览
393

从git-merge的手册页中,您可以使用许多合并策略 .

  • resolve - 这只能使用3向合并算法解析两个头(即当前分支和你从中拉出的另一个分支) . 它试图仔细检测纵横交错的合并模糊,并且通常被认为是安全和快速的 .

  • recursive - 这只能使用3向合并算法解析两个头 . 当有多个可用于3向合并的共同祖先时,它会创建共同祖先的合并树,并将其用作3向合并的参考树 . 据报道,这可以减少合并冲突,而不会因为从Linux 2.6内核开发历史记录中进行的实际合并提交而导致错误合并 . 此外,这可以检测和处理涉及重命名的合并 . 这是拉动或合并一个分支时的默认合并策略 .

  • 章鱼 - 这解决了两个以上的案例,但拒绝进行需要手动解决的复杂合并 . 它主要用于将主题分支头捆绑在一起 . 这是拉动或合并多个分支时的默认合并策略 .

  • ours - 这解决了任意数量的头,但合并的结果始终是当前的分支头 . 它旨在用于取代侧枝的旧发展历史 .

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

我什么时候应该指定不同于默认值的东西?哪些场景最适合?

3 回答

  • 287

    实际上,您想要选择的两个策略是 ours ,如果您想放弃分支带来的更改,但是将分支保留在历史记录中,如果要将独立项目合并到超级项目的子目录中(如'git'存储库中的'git-gui'),则为 subtree .

    合并两个以上的分支时会自动使用章鱼合并 . 解决方法主要是出于历史原因,以及何时受到递归合并策略极端情况的影响 .

  • 20

    我不熟悉决心,但我用过其他人:

    递归

    递归是非快进合并的默认值 . 我们都熟悉那一个 .

    八达通

    当我有几棵树需要合并时,我已经使用了章鱼 . 你可以在大型项目中看到这一点,在这些项目中,许多分支机构已经进行了独立开发,并且它们已经准备好整合到一个单独

    章鱼分支在一次提交中合并多个头,只要它可以干净地完成 .

    为了说明,假设您有一个具有master的项目,然后是三个要合并的分支(称为a,b和c) .

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

    series of recursive merges

    但是,单个章鱼合并将如下所示:

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

    octopus merge

    我们的

    我们==我想拉另一个头,但扔掉所有引入的变化 .

    这样可以保留分支的历史记录而不会产生任何分支的影响 .

    (阅读:甚至没有看到这些分支之间的变化 . 分支刚刚合并,没有对文件进行任何操作 . 如果你想在另一个分支中合并,每次有问题"our file version or their version"你可以使用 git merge -X ours

    子树

    当您想要将另一个项目合并到当前项目的子目录中时,子树很有用 . 当您拥有一个库时,您不希望将其包含为子模块 .

  • 44

    “解决”与“递归”合并策略

    递归是当前默认的双头策略,但经过一些搜索后我终于找到了一些关于“解析”合并策略的信息 .

    取自O'Reilly的书Version Control with GitAmazon)(转述):

    最初,“resolve”是Git合并的默认策略 . 在交叉合并的情况下,有多个可能的合并基础,解决策略的工作方式如下:选择一个可能的合并基础,并希望最好 . 这实际上没有它听起来那么糟糕 . 事实证明,用户一直在处理代码的不同部分 . 在这种情况下,Git检测到它正在重新出现已经存在的一些变化并跳过重复的更改,避免冲突 . 或者,如果这些是导致冲突的轻微变化,至少冲突应该很容易让开发人员处理..

    我使用"resolve"成功合并了树,但是使用默认的递归策略失败了 . 我收到了 fatal: git write-tree failed to write a tree 错误,感谢this blog postmirror)我试过"-s resolve",这很有效 . 我仍然不确定为什么......但我认为这是因为我在两棵树上都有重复的更改,并且正确地解决它们 .

相关问题