当前位置:  开发笔记 > 运维 > 正文

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

如何解决《你什么时候会使用不同的git合并策略?》经验,为你挑选了3个好方法。

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

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

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

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

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

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

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



1> Dustin..:

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

递归

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

章鱼

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

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

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

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

一系列递归合并

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

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

章鱼合并

我们的

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

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

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

子树

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


您不需要指定**章鱼**合并策略:如果您合并两个以上的分支(`git merge AB ...`),它会自动使用.
图像链接坏了
[gitg](https://wiki.gnome.org/action/show/Apps/Gitg)适用于linux环境下的用户.
这个"-X our"的提示非常棒,只为我节省了一个小时的工作量.

2> Jakub Narębs..:

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

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


@WattsInABox:自动选择所有其他人.
我没有对你投票,但你没有真正解释为什么这些是你想要选择的唯一策略.你刚才说它就像是事实.
@SebTu:没有`theirs`合并策略(即`--strategy = theirs`),但默认的`recursive`合并策略有`theirs`选项(即`--strategy = recursive --strategy -option = theirs`,或者只是`-Xtheirs`).

3> thaddeusmt..:

"解决"与"递归"合并策略

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

取自O'Reilly的书籍版本控制与Git(亚马逊)(转述):

最初,"resolve"是Git合并的默认策略.

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

我使用默认递归策略失败的"resolve"成功合并了树.我收到了fatal: git write-tree failed to write a tree错误,感谢这篇博文(镜像),我试过"-s resolve",这很有用.我仍然不确定为什么......但我认为这是因为我在两棵树上都有重复的变化,并且正确地"跳过"了它们.

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有