《Git 系列》Git 合并算法知多少?

文章讲述了在多人协作的开发环境中,版本管理工具如Git如何处理代码冲突。介绍了自动合并和手动合并的概念,重点解析了三路合并算法,包括其过程、特点以及在处理代码冲突时的角色。此外,还提到了Git的其他合并策略,如resolve和recursive,以及在合并多于两个分支时的octopus策略。
摘要由CSDN通过智能技术生成

前言

我们的日常开发都是多人协作式开发,必然会遇到不同的人在不同的分支上对同一份代码做了改动。
这种情况下,当我们合并这两个分支时,版本管理工具(比如 Git) 必须考虑如何处理这些改动,应该保留/丢弃哪个分支的哪些改动。

版本管理工具的合并流程分两种:

  • 自动合并:版本管理工具判断自己就可以合并改动,则自动合并,适用简单的、没有复杂冲突的合并
  • 手动合并:工具搞不定,只能人工来介入
    在这里插入图片描述

合并算法

  • three-way merge:三路合并
  • recursive three-way merge:递归三路合并

three-way merge - 三路合并

![在这里插入图片描述](https://img-blog.csdnimg.cn/d63700ddad474588b90d2bba712b2489.png

我们有三个文件 PAB,其中:
P 是原始文件,我们把它的内容分成四个部分 X Y Z W
A:修改了 Z & WZ -> Z1, W -> W1
B:修改了 Y & WY -> Y1, W -> W2

现在我们要合并 A & B。

三路合并的过程:

  1. X 部分在 P, A, B 相同,保留 X 到最终文件
  2. Y 部分在 P, A 相同,B 修改成 Y1,保留 Y1 到最终文件
  3. Z 部分在 P, B 相同,A 修改成 Z1,保留 Z1 到最终文件
  4. W 部分在 P, A, B 中均不相同,需要手动处理代码冲突,手动合并代码

算法特点:

  • 合并的两个文件必须拥有 唯一的共同祖先(如果有多个共同祖先,需要使用下面的 recursive three-way merge 算法)
  • 同一块代码,在三个文件(两个修改文件+原始文件)只出现了两个版本:可以自动合并
  • 同一块代码,在三个文件(两个修改文件+原始文件)出现了三个版本:只能手动合并

实现软件

  • diff3
  • diff
  • Git resolve

recursive three-way merge - 递归三路合并

在这里插入图片描述

如果要合并的两个文件有 多个共同祖先,则把这些共同祖先合并成一个文件,然后就可以 三路合并 了。

注意:合并共同祖先为一个文件 本身就是三路合并,如果这些祖先的共同祖先不止一个,又要重复上面的过程;
这是一个递归的过程,这就是 recursive three-way merge

Git 合并策略

Git 提供了多种合并策略:

  • resolve: 传统的 three-way merge
  • recursiverecursive three-way merge,当我们 pullmerge 时默认这种合并算法。
  • octopus:合并多于两个分支时默认这种算法

参考资料

  1. https://en.wikipedia.org/wiki/Merge_(version_control)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

plattoo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值