git merge的算法

本文详细介绍了Git的merge命令执行过程,包括fast-forward合并与三方合并的概念。在fast-forward模式下,如果合并分支是目标分支的直接后代,Git会简单地将目标分支向前移动。当不能fast-forward时,Git会进行三方合并,选取共同祖先及双方最新提交,处理可能的冲突。这一过程涉及到Git的基本操作和冲突解决策略。
摘要由CSDN通过智能技术生成

当执行git merge的命令的时候,工作的顺序如下:

  1. 判断是否可以fast-forward,如果可以直接fast-forward并结束流程,如果不能执行第2步。
  2. 不能fast-forward的话,需要执行三方合并。

1 判断是否可以fast-forward

整体的判断规则是,如果当前分支所在的commit节点是被合入的分支所在commit节点的直接祖先,那执行git merge可以直接把当前分支前进到被合入分支所在commit节点。

下面是几个不同情况的例子:

  1. 如下图,iss53分支所在commit节点是master分支所在commit节点的直接子孙,在master分支执行git merge iss53可以直接把master分支fast-forward到iss53所在commit节点
    在这里插入图片描述
  2. 如下图,hotfix分支和iss53分支所在commit节点都是master分支所在commit节点的子孙,执行git merge hotfixgit merge iss53可以直接把master分支fast-forward到hotfix分支或iss53分支所在的commit节点
    在这里插入图片描述
  3. 如下图,master分支所在commit节点是iss53分支所在commit节点的直接子孙,在iss53分支执行git merge master时会直接将iss53分支fast-forward到master所在的commit节点。
    在这里插入图片描述

2 三方合并的过程

在这里插入图片描述
如图所示,当在master分支执行git merge iss53时,并不能直接fast-forward,那么git会选择master分支所在的commit节点C4、iss53分支所在的commit节点C5以及两者最近的共同祖先C2做三方合并:

  1. 找到C2C4C5三个节点都相同的文件作为新的节点的一部分文件快照
  2. 在剩下的文件中找到 被C4修改而没有被C5修改的文件 和 被C5修改而没有被C4修改的文件 作为新的节点的一部分文件快照
  3. 剩下的文件快照是即被C4修改又被C5修改的文件
    • 如果两个节点修改的位置不同,将两者的修改都放入文件作为新的节点的文件快照
    • 如果两个节点修改的位置相同,那么会产生冲突,由用户自己处理冲突后作为新的节点的文件快照
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值