git merge规则

参考文档:https://juejin.cn/post/7129333439299321887

丹尼尔:Hi,蛋兄,周杰伦都出新专辑了,你咋还不更新啊,真的打算半年一更啊?
蛋先生:好像确实是这样,要不,择日不如撞日,今天聊聊?
丹尼尔:好啊,那聊些啥呢?
蛋先生:最近搞的事情需要实现两个应用项目的代码合并,逻辑就完全参照 git merge 的基本原则,那就聊聊 git merge 吧
丹尼尔:git merge 我倒是经常用,不过却从未关心过它内部是怎么实现的。那你跟我讲一下它的工作原理呗。
合并的基本原则: three-way
蛋先生:git merge 的基本原则是 three-way
丹尼尔:3 条路?啥东东?
蛋先生:简单讲就是有 3 个分支。假设就叫 a, o, b,其中 a 和 b 都来自于 o,如下所示:image

丹尼尔:嗯,然后呢?
蛋先生:现在 a 和 b 要进行合并。假设你当前在 a 分支,然后运行 git merge b,那么合并结果是根据 a, o, b 之间的内容比较结果分析得出的。
丹尼尔:哦,嗯,比较逻辑是什么呢?
蛋先生:Very 简单。只要 a, o, b 任意两个的内容一致,就放弃 o 的内容;如果都不一样,就冲突。如下图所示image

丹尼尔:只要...
蛋先生:我还是列举下所有的场景吧,然后你就会明白了
1). o == a, o != b

假设内容如下:
o: daniel
a: daniel
b: dx-b

a merge b 的结果: dx-b
2). o == b, o != a

假设内容如下:
o: daniel
a: dx-a
b: daniel

a merge b 的结果: dx-a
3). a == b, o != a

假设内容如下:
o: daniel
a: dx-ab
b: dx-ab

a merge b 的结果: dx-ab
4). o != a, o != b, a != b

假设内容如下:
o: dx-o
a: dx-a
b: dx-b

a merge b 的结果: 冲突
<<<<<<< a
dx-a

dx-b

b

丹尼尔:哦,懂了,就是以 o 为基准来判断该保留哪个分支的内容,如果判断不了,就提示冲突,自行解决。
蛋先生:没错
丹尼尔:上面是假设 3 个分支要对比的文件都存在,那如果某个分支的文件被删除或有新文件,该怎么处理呢?
蛋先生:你可以把缺少的文件当作空内容文件来处理。嗯,这样说好像也不太准确。我还是再列举下场景吧。以下假设要比较各分支的 dx.txt 文件
1). o 有, a 有, b 没

假设 1: o == a

合并结果:删除文件

因为 o == a,所以取 b 的结果

假设 2: o != a

合并结果:保留文件,内容为 a 的内容

因为 o, a, b 互不相同,结果为冲突,但 b 没有文件,所以冲突结果直接取 a 的内容

2). o 有, a 没, b 有
与(1)类似,相当于把 a 换成 b
3). o 有, a 没, b 没
合并结果:删除文件

a == b,所以取 a 或 b 的结果,即删除

4). o 没, a 有, b 没
合并结果:取 a 的内容

o == b,所以取 a 的内容

5). o 没, a 没, b 有
与 (4) 类似,相当于把 a 换成 b
6). o 没, a 有, b 有

假设 1: a == b

合并结果:取 a(或 b)的内容

假设 2: a != b

合并结果:冲突
丹尼尔:漂亮,这下我完全搞懂了合并逻辑了。
Diff 的实现算法:最长公共子序列
丹尼尔:但我还有一个疑问,对比文件内容的时候,是一行一行内容对比的吧
蛋先生:那是当然了
丹尼尔:那如果我加多一行,故意错开,岂不是都对不上了
蛋先生:当然...是不会犯这样低级的错误的。在实现 diff 的时候,是利用了 LCS(Longest Common Sequence,即最长公共子序列)的算法。用下图来简单了解一下
假设有两个字符串 S1 和 S2,那它们的最长公共子序列就是 abcd
vbnet复制代码S1: "abcde"
S2: " a1bc2d"

丹尼尔:哦。但这是字符串,该怎么应用到文件内容的 diff 上呢?
蛋先生:把图转一转,每个方块代表文件的一行内容,是不是就一样了

丹尼尔:是哦。通过 LCS 的算法,就算我故意错开了行,也不影响比较,因为相同内容的行总是能对得上
蛋先生:恩,不过这里只是两个文件的比较,而 three-way 是三个文件内容的比较,要稍微多做点事
丹尼尔:能讲得具体一点吗?
蛋先生:上个图吧。假设我们要合并 a 和 b 分支的 dx.txt 文件,先使用 LCS 来计算三个分支该文件内容的最长公共子序列(下图就是连线的内容为a,c,e的行),然后以这些子序列对各个文件的内容行进行分割,分割的块(下图中杂乱曲线的部分)就是不相同的部分,对这些块的内容进行 three-way 分析,即可得出这些内容块合并后的结果

丹尼尔:恩,终究还是有图有真相啊,图一看就明白了。讲了这么多,要不直接 show 下代码吧
蛋先生:一样的思路,可以有各种各样的实现。我自个实现了一个简单的版本,请移步到 codepen.io 查看。也可以去瞧瞧 node-diff3 的代码实现,它比较严谨,毕竟是一个可上生产的模块
丹尼尔:好咧,等会就去观摩观摩
小插曲
丹尼尔:我刚刚特意上网查了一下,git merge 的默认策略是 recursive,为啥叫递归呢?
蛋先生:还记得 git merge 的基本原则是 three-way 吗?a 和 b 的共同祖先是 o,但有些情况下,a 和 b 的共同祖先可能不止一个,这时就需要将这些共同祖先通过 three-way 进行合并,这个动作会一直往上递归到根祖先分支,所以这也是策略叫 recursive 的原因。
丹尼尔:除了 recursive,git merge 还有哪些合并策略呢?
蛋先生:这个就要看你安装的 git 的版本了。git merge 可以指定合并策略。这里有个小技巧,你可以故意给个不存在的策略名称,git 就会显示出所有可用的策略名称,如下所示:
sh复制代码$ git merge -s dx
Could not find merge strategy 'dx'.
Available strategies are: octopus ours recursive resolve subtree.

最后
丹尼尔:要不是我买了周杰伦的专辑,才想起你也好久没更新了,也就不会有今天这一出了
蛋先生:感谢提醒,合作愉快
丹尼尔:真快,又到了说再见的时候了
蛋先生:See you next time!
丹尼尔:看到这里的童鞋们,要不点个赞鼓励一下 ( )

作者:蛋先生DX
链接:https://juejin.cn/post/7129333439299321887
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/97221.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

threejs使用gui改变相机的参数

调节相机远近角度 定义相机的配置&#xff1a; const cameraConfg reactive({ fov: 45 }) gui中加入调节fov的方法 const gui new dat.GUI();const cameraFolder gui.addFolder("相机属性设置");cameraFolder.add(cameraConfg, "fov", 0, 100).name(…

python:tkinter + cef 模仿 mdict 界面

cefpython3 其上游是C开发的CEF&#xff08;基于webkit、V8&#xff09;&#xff0c; CEF 即 (Chromium Embedder Framework)&#xff0c; 是基于Google Chromium项目的开源 Web browser控件(WebView)。 可查看github文档&#xff1a;cefpython api pip install cefpython3 c…

车载APP软件外包开发流程

车载APP的开发流程涉及多个阶段&#xff0c;从概念到发布都需要仔细的规划和执行。以下是一个一般性的车载APP开发流程概述&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.需求分析和规划&#xff…

vulnhub靶机DarkHole_2

靶机下载地址&#xff1a;DarkHole: 2 ~ VulnHub 靶机发现 arp-scan -l 扫描端口 nmap --min-rate 10000 -p- 192.168.21.145 扫描服务 nmap -sV -sT -O -p22,80 192.168.21.145 漏洞扫描 nmap --scriptvuln -p22,80 192.168.21.145 这里有git源码泄露 git clone mirrors…

x.view(a,b)及x = x.view(x.size(0), -1) 的理解说明

x.view()就是对tensor进行reshape&#xff1a; 我们在创建一个网络的时候&#xff0c;会在Foward函数内看到view的使用。 首先这里是一个简单的网络&#xff0c;有卷积和全连接组成。它的foward函数如下&#xff1a; class NET(nn.Module):def __init__(self,batch_size):sup…

1.flink快速入门

前言 下图表示的是一个简单的flink-job的计算图&#xff0c;这种图被称为DAG(有向无环图)&#xff0c;表示的这个任务的计算逻辑&#xff0c;无论是spark、hive、还是flink都会把用户的计算逻辑转换为这样的DAG&#xff0c;数据的计算按照DAG触发&#xff0c;理论上只要构建出…

Seaborn数据可视化(一)

目录 1.seaborn简介 2.Seaborn绘图风格设置 21.参数说明&#xff1a; 2.2 示例&#xff1a; 1.seaborn简介 Seaborn是一个用于数据可视化的Python库&#xff0c;它是建立在Matplotlib之上的高级绘图库。Seaborn的目标是使绘图任务变得简单&#xff0c;同时产生美观且具有信…

【脚本推荐】网页字体渲染插件

下图是三种网页字体增强的效果对比。 **SUM&#xff1a;**前面两个都是通过脚本运行&#xff0c;而最后一个是通过扩展插件&#xff1b;中间的脚本&#xff08;字体渲染&#xff09;效果是最好的&#xff0c;可惜输入框没有效果&#xff0c;也就意味着如果现在网页上写写学习笔…

2023最新版本~KEIL5使用C++开发STM32

先看效果 开始教学 因为是第一次写这个配置教程 我会尽量详细些 打开一个Keil工程 移除本地core 添加在线core 第一次编译代码 不会有报错 修改main.c文件类型为C 点击魔术棒 把ARM编译器修改为V6 第二次编译会报错语法不兼容 我把汇编部分的这些代码做了…

Mac 使用 rar 命令行工具解压和压缩文件

在 Mac 中常遇到的压缩文件有 zip 和 rar 格式的&#xff0c;如果是 zip 格式的 Mac 系统默认双击一下文件就能直接解压了&#xff0c;但 rar 文件就不行。 需要额外下载 rar 工具了实现。 第一步&#xff1a;下载 rar 工具 工具网址&#xff1a;https://www.rarlab.com/dow…

安防监控视频云存储平台EasyNVR通道频繁离线的原因排查与解决

安防视频监控汇聚EasyNVR视频集中存储平台&#xff0c;是基于RTSP/Onvif协议的安防视频平台&#xff0c;可支持将接入的视频流进行全平台、全终端分发&#xff0c;分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。为了满足用户的集成与二次开发需求&#xf…

记录一次arcgis engine开发版本引入问题

之前基于arcigs 10.1vs2013开发的程序&#xff0c;现在拿出来要改&#xff0c;但是目前版本是arcgis10.7vs2017/vs2019,打开后无论如何替换引用版本&#xff0c;都报错 &#xff08;具体版本对应可以看这&#xff1a;ArcGIS Engine 与 Visual Studio 版本对照表_vs2019对应啥版…

神经网络基础-神经网络补充概念-02-逻辑回归

概念 逻辑回归是一种用于二分分类问题的统计学习方法&#xff0c;尽管名字中带有"回归"一词&#xff0c;但实际上它用于分类任务。逻辑回归的目标是根据输入特征来预测数据点属于某个类别的概率&#xff0c;然后将概率映射到一个离散的类别标签。 逻辑回归模型的核…

Git命令详解

1 常用命令 1&#xff09;初始化本地仓库 git init <directory> 是可选的&#xff0c;如果不指定&#xff0c;将使用当前目录。 2&#xff09;克隆一个远程仓库 git clone <url> 3&#xff09;添加文件到暂存区 git add <file> 要添加当前目录中的所…

Spring Boot 统一功能处理

目录 1.用户登录权限效验 1.1 Spring AOP 用户统一登录验证的问题 1.2 Spring 拦截器 1.2.1 自定义拦截器 1.2.2 将自定义拦截器加入到系统配置 1.3 拦截器实现原理 1.3.1 实现原理源码分析 2. 统一异常处理 2.1 创建一个异常处理类 2.2 创建异常检测的类和处理业务方法 3. 统一…

VALN-hybrid模式

实验拓扑及要求 一、实验思路 1.R1-R3按要求配置&#xff0c;R2不划分vlan使其全部都可以访问 2.交换机和路由器的交换机直连接口设为hybrid模式且R4-R6不带vlan标签访问路由器 3.交换机和交换机的两个直连接口设为hybrid模式且只允许R4-R6所在vlan标签通过 4.R4-R6只允许其…

音视频 FFmpeg音视频处理流程

ffmpeg -i test_1920x1080.mp4 -acodec copy -vcodec libx264 -s 1280x720 test_1280x720.flv推荐一个零声学院项目课&#xff0c;个人觉得老师讲得不错&#xff0c;分享给大家&#xff1a; 零声白金学习卡&#xff08;含基础架构/高性能存储/golang云原生/音视频/Linux内核&am…

C++进阶 特殊类的设计

本篇博客介绍&#xff1a;介绍几种特殊的类 特殊类的设计 设计一个类不能被拷贝设计一个类 只能在堆上创建对象设计一个类 只能在栈上创造对象设计一个类不能被继承单例模式饿汉模式懒汉模式单例模式对象的释放问题 总结 设计一个类不能被拷贝 我们的拷贝只会发生在两个场景当…

OSPF在广播类型的网络拓扑中DR和BDR的选举

指定路由器&#xff08;DR&#xff09;&#xff1a; 一个网段上的其他路由器都和指定路由器&#xff08;DR&#xff09;构成邻接关系&#xff0c;而不是它们互相之间构成邻接关系。 备份指定路由器&#xff08;BDR&#xff09;&#xff1a; 当DR出现问题&#xff0c;由BDR接…