git merge的原理和过程,merge conflict产生的原因、处理的逻辑

一、git merge的原理和过程

  • 检测合并基础+三方合并+工作副本更新(生成一个新节点提交)

例子:

如上图所示,我们有两个分支,master 分支和 test 分支,test 分支是基于 master 分支在B处的提交节点创建的,在创建后 master 分支又经过迭代提交了两次,从C到D节点,test 分支也基于B往前继续更新了两次,到了F节点。两者从B开始就走向了分叉。

这时如果我们想将 test 分支合并到 master 分支,则会生成一个节点G,它是将基础节点也就是B,两个分支的最新提交D和F进行三方合并,生成节点

再解释一下与git merge类似作用的git rebase:

官方解释: 当执行 rebase 操作时,git 会从两个分支的共同祖先开始提取待变基分支上的修改,然后将待变基分支指向基分支的最新提交,最后将刚才提取的修改应用到基分支的最新提交的后面。

如上图所示:

git就会从两者的共同祖先B开始,提取 master 分支上的修改,也就是 C,D 两个 commit ,提取到之后 git 会先保存起来,然后将master 分支指向 test 分支最新提交的节点,也就是F节点,然后把提取到的 C,D 接到F后面,在这个过程当中,会删除原来的C,D commit 记录,生成新的C',D',虽然C',D'和原来的C,Dcoommit的内容是一样的,但是 commit id 是不同的。

rebase 操作如果用一句话进行解释就是改变基底。master 分支原来的基底是A,现在变成了以 test 分支最新的提交F做为新的基底了。

二、merge conflict产生的原因、处理的逻辑

Merge Conflict产生的原因:

首先在merge时对于每个文件,Git会对比这三个提交点(三路)中的内容。如果双方对某个文件的修改不冲突(修改的内容是一致的),Git则能自动将这些更改合并在一起。如果在共同祖先之后,两个分支对同一文件做出了不同的修改,那么就会出现冲突,Git会在合并过程中标记出这些冲突,并暂停合并,等待用户手动解决。

通常发生在以下情况会产生冲突:

  1. 同一个文件的同一个位置被不同的分支修改:如果两个分支都在一个文件的同一行进行了修改,Git将无法确定哪个修改是正确的。

  2. 删除与修改冲突:一个分支删除了一个文件或行,而另一个分支修改了同一个文件或行。

  3. 分支整体的改变:如果某个文件的整个区域发生了较大的修改,这也可能导致Git无法自动合并。

Merge Conflict处理的逻辑:

  1. 查看冲突:Git标记发生冲突的文件,并在文件中添加冲突标记,以供开发者手动解决。冲突部分会显示如下:

    复制代码
    <<<<<<< HEAD Your changes ======= Incoming changes from the other branch >>>>>>> branch-name
  2. 手动解决冲突:开发者需要手动编辑文件,选择保留哪部分的更改或者进行合并,确保最终文件内容的正确性。

  3. 标记为解决 :解决冲突后,使用git add将解决后的文件标记为已解决。

  4. 完成合并 :在所有冲突解决后,使用git commit提交合并结果。

相关推荐
YIN_尹5 小时前
【git原理与使用】git基本操作及底层原理(二)
大数据·git·elasticsearch
程序员爱德华10 小时前
Git 命令
git
Cry丶1 天前
Git Rebase 操作备忘
git·rebase
你叶不叶1 天前
abap git 如何从 gitee上在线拉取数据(上一步已经配置好证书)
git·gitee·sap·abapgit
kuroomi2 天前
Git入门
git·kubernetes
daliucheng2 天前
lazygit 上手:日常 git 操作一篇讲完
git
codigger2 天前
大厂git提交规范
git·程序员
挖掘狂人2 天前
六条分支,一条主干:我的 Git 分支管理心得
git·后端·程序员
Brookty2 天前
Git与GitHub系统学习|本地Git工作模型:终端与进程、CWD、HEAD/Index/工作树及Git对象
git·github
2301_767113983 天前
点过“不再询问”就要检查:Claude Code权限文件也可能存着密钥
git·信息安全·claude code