GIt分支合并

c 复制代码
分支 1: C0 → C1 → C2 → C3(最新)
分支 2: C0 → C4 → C5 → C6(最新)

1. 找到共同父节点 C0

Git 会先找出 branch1branch2 的共同祖先节点 C0。这通常借助 git merge-base 命令达成,虽然在日常使用 git merge 时不需要手动执行该命令,但 Git 内部会自动完成这个操作:

bash 复制代码
# 手动获取共同父节点(仅用于演示原理)
common_ancestor=$(git merge-base branch1 branch2)

2. 计算差异

Git 会分别计算 branch1branch2 相对于共同父节点 C0 的差异。它采用的是一种基于内容的差异算法,也就是找出文件内容在不同版本之间的变化。具体来说:

  • 对于 branch1,Git 会分析从 C0branch1 最新提交 C1 期间文件内容的改动,例如哪些文件被新增、修改或者删除。
  • 对于 branch2,Git 会分析从 C0branch2 最新提交 C2 期间文件内容的改动。

3. 应用差异

接下来,Git 会尝试把 branch1 相对于 C0 的差异应用到 branch2 上。这一过程可以分为以下几种情况:

无冲突情况

如果 branch1branch2 的修改没有重叠,也就是没有对同一文件的同一部分进行修改,Git 会直接将 branch1 的修改合并到 branch2 中。例如:

  • 新增文件 :如果 branch1 相对于 C0 新增了一个文件,Git 会在 branch2 中也创建这个文件,并将其内容复制过来。
  • 修改文件 :如果 branch1 对某个文件进行了修改,而 branch2 没有对该文件进行修改,Git 会把 branch1 对该文件的修改应用到 branch2 对应的文件上。
  • 删除文件 :如果 branch1 相对于 C0 删除了一个文件,而 branch2 没有对该文件进行修改,Git 会在 branch2 中也删除这个文件。
有冲突情况

branch1branch2 对同一文件的同一部分进行了不同的修改时,就会产生冲突。Git 无法自动决定采用哪个修改,因此会在冲突的文件中标记出冲突的部分。例如,文件中会出现类似如下的冲突标记:

复制代码
<<<<<<< HEAD
这是 branch2 中的内容
=======
这是 branch1 中的内容
>>>>>>> branch1

<<<<<<< HEAD 表示当前分支(即 branch2)的内容,======= 是分隔符,>>>>>>> branch1 表示要合并进来的分支(即 branch1)的内容。此时需要手动编辑这些内容,选择保留哪些部分,或者将两部分内容进行整合。

4. 创建合并提交

无论是否有冲突,在完成差异应用后,Git 都会创建一个新的合并提交。这个合并提交有两个父节点,分别是 branch2 的最新提交 C2branch1 的最新提交 C1。合并提交记录了合并操作的结果,将两个分支的修改整合到了一起。可以使用以下命令查看合并提交的信息:

bash 复制代码
git log --graph --oneline --all

综上所述,Git 通过找到共同父节点、计算差异、应用差异和创建合并提交这几个步骤,实现了将 branch1 相对于 C0 的差异应用到 branch2 上的操作。

简单来说,合并的分支与当前分支必定会有共同的父节点,git会依次执行要合并的分支上的每一次提交,最终与当前分支的最新一次提交一起生成一次新的提交。

相关推荐
摇滚侠9 分钟前
零基础小白自学Git_Github教程,Git 四个分区的概念,笔记11
笔记·git·github
不败公爵11 分钟前
Git的工作机制
笔记·git·stm32
2***b8815 分钟前
Nginx 反向代理之upstream模块以及完整配置反向代理示例
git·nginx·github
ccLianLian2 小时前
计算机基础·Git版本控制
git
爱写代码的liding2 小时前
git 常用命令
大数据·git·elasticsearch
弥巷3 小时前
【Git】Git的配置与使用(非常详细)
git·github
摇滚侠3 小时前
零基础小白自学Git_Github教程,仓库的其它功能-项目管理,笔记09
笔记·git·github
小生不才yz4 小时前
(三)分支与标签 - git tag 命令的使用
git
摇滚侠4 小时前
零基础小白自学 Git_Github 教程,DeskTop 进阶操作,笔记12
笔记·git·github
量子炒饭大师4 小时前
【一天一个计算机知识】—— 【编程百度】悬空指针
c语言·数据结构·c++·git·安全·github·dubbo