【Git】分支合并冲突产生与解决

文章学习自:麦兜搞IT,如有侵权,告知删除

文章目录

  • 前言
  • 1 Fast Forword 合并
    • 1.1 核心原理
    • 1.2 举个栗子
    • 1.3 经验之谈
  • 2 three way merge
    • 2.1 核心原理
    • 2.2 举个栗子(不带冲突)
    • 2.3 带冲突的three way merge
  • 3 变基rebase
    • 3.1 引入rebase
    • 3.2 核心原理
  • 4 冲突问题
    • 4.1 产生冲突的原因
    • 4.2 常见冲突场景
    • 4.3 解决冲突

前言

合并操作在Git中属于最为核心的一个操作,包括三种合并方式:一种为fast forward ,需要满足有非常强的前提条件才能执行;一种为3 way merge方式,这种是我们工作中常见的;最后一种为变基rebase。另外,本篇文章也会深入讲解冲突如何产生,以及如何解决

1 Fast Forword 合并

1.1 核心原理

需求:将bugfix分支合并到master(切换到master然后执行git merge bugfix)

Fast Forword 合并: 将master分支指针向前快速移动到bugfix分支所指向的commit对象,在此合并方式下,不会产生冲突

前提条件: bugfix和master分支具有完全相同的提交历史(即bugfix提交历史中有master最新的提交)

1.2 举个栗子

合并前描述
master分支指向C2代表的commit对象,而bugfix超前于master分支1次提交(这里可以超前多次),指向了C3所代表的commit对象。符合fast forward merge
在这里插入图片描述

执行命令
git checkout master
git merge bugfix

合并后描述
master指针快速移动到bugfix指针所指向的commit对象C3
在这里插入图片描述

合并过程中发生的事情

1、.git/ 目录下会新增一个文件 ORIG_HEAD文件,该文件为指向master上一次commit的指针,用于回滚,即若发现合并错了,那执行git reset ORIG_HEAD即可完成回滚操作
2、不会产生新的commit、bolb、tree对象

1.3 经验之谈

在实际工作场景中,此合并方式基本不会遇到,除非代码仓库只有自己在维护。而我们通常遇到的情况都是下面要讲的3 way merge 或者rebase的情况,也即bugfix和master分支不具有完全相同的提交历史,产生了分叉

2 three way merge

2.1 核心原理

需求:将bugfix分支合并到master(切换到master然后执行git merge bugfix)

three way merge: Git 需要比较三个版本的代码,即两个分支的最新提交对象和它们的共同祖先提交对象。Git 使用一种叫做三方合并(three-way merge)的技术来自动合并这三个版本的代码。

合并过程:
1、找到两个分支的共同祖先提交对象,确定两个分支之间的修改范围,确定冲突的位置

2、比较两个分支的最新提交对象和共同祖先分支之间的差异,确定每个分支中的修改内容。

3、合并两个分支的修改。根据比较结果,Git 将两个分支的修改合并起来。如果两个分支对同一个文件的不同部分进行了修改,Git 将尝试自动合并这些修改。如果这些修改发生在同一个文件的同一个区域,Git 就会提示用户手动解决冲突。

2.2 举个栗子(不带冲突)

合并前描述
A用户对master执行了合并,使得master指针从C2变为了C4;B用户对bugfix执行了commit操作,使得bugfix从C2变为了C3,此时,产生了分叉。我们的目标是要将bugfix合并到master上
在这里插入图片描述

执行命令
git checkout master
git merge bugfix

此时会跳转到一个vim界面,编辑本次merge包括了哪些信息,这个自己填写就可以
在这里插入图片描述

合并后描述
产生一个新的commit对象C5,它的parent有两个,C3与C4,同时master指针指向C5,合并完成
在这里插入图片描述

2.3 带冲突的three way merge

合并前描述
master和bugfix对同一文件的同一区域进行了修改,现在要将bugfix分支合并到master
在这里插入图片描述
执行命令
git checkout master
git merge bugfix

此时会显示如下冲突信息
在这里插入图片描述

此时也可以使用git status来查看有哪些文件产生了冲突
在这里插入图片描述
然后可以使用git diff 冲突文件路径来查看差异,最后可以手动解决(git add git commit即可)。
当然目前有很多IDE内置了很方便的冲突解决功能

合并后描述
产生C4,parent是C2,C3,C4中的test.txt是你解决完冲突后的内容

3 变基rebase

git rebase命令适合有强迫症的人使用。

3.1 引入rebase

3 way merge方式在git历史线上会产生分叉,类似下面,红色代表dev,蓝色代表master
在这里插入图片描述
有些人就觉得,不行,必须得是直线才好看,也就是想在3 way merge的方式下还想达到fast forward的效果(fast forward在git 历史上是直线),所以产生了git rebase

3.2 核心原理

核心原理:将一个分支的修改“移动”到另一个分支上。

基本步骤
git rebase根据会新增commit 对象。待补充

4 冲突问题

4.1 产生冲突的原因

核心原因多个分支同一个文件同一部分进行了修改,并且这些修改是相互矛盾的,无法自动合并。

具体来说,当多个分支对同一个文件的同一部分进行了修改时,Git 会尝试自动合并这些修改,并将合并结果应用于最终合并结果中。但是,如果这些修改是相互矛盾的,例如一个分支将文件的某个部分删除了,而另一个分支对该部分进行了修改,则 Git 就无法自动合并这些修改,会提示合并冲突。

在这种情况下,开发者需要手动解决冲突,从而完成合并操作。手动解决冲突的过程中,开发者需要根据需要保留、修改或删除对应的代码行或代码段。解决冲突后,开发者需要将修改提交到 Git 仓库中。

4.2 常见冲突场景

1、git merge时(3 way merge)
2、git pull时

以下场景不会产生冲突:

场景一:
假设有两个分支,分别是 A 和 B,它们都对同一个文件 file.txt 进行了修改:

分支 A 对 file.txt 进行了删除操作; 分支 B 对 file.txt 进行了修改操作。 这时候,如果要合并这两个分支,Git就会自动先将分支 B 对 file.txt 的修改操作合并到最终合并结果中,再将A 对 file.txt 的删除操作合并到最终合并结果中,而不会提示合并冲突
最终合并的结果是file文件被删除了

4.3 解决冲突

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android WiFi框架概览

概览 Android 提供默认 Android 框架实现,其中包括对各种 WLAN 协议和模式的支持,这些协议和模式包括: WLAN 基础架构 (STA)网络共享模式或仅限本地模式下的 WLAN 热点 (Soft AP)WLAN 直连(点对点)WLAN 感知 (NAN)WL…

【简单认识MySQL主从复制与读写分离】

文章目录 一、MySQL主从复制1、配置主从复制的原因:2、主从复制原理1、 MySQL的复制类型2、 MySQL主从复制的工作过程;1、 MySQL主从复制延迟2、优化方案:3、 MySQL 有几种同步方式: 三种4、异步复制(Async Replication&#xff0…

Stream流List转Map报错Duplicate key StreamMap

项目场景: JDK8引入了Stream流,让程序员在开发中更方便进行集合之间的转换,在使用Stream流将List转为Map时,如果Map的key有重复的情况下,就会抛出java.lang.IllegalStateException: Duplicate key StreamMap这个异常。…

算法竞赛备赛之经典数据结构训练提升,暑期集训营培训

1.链表与邻接表:树与图的存储 我们将结构体和指针结合来实现链表 struct Node {int val;Node * next; }; ​ new Node;//这样创建结点是相当慢的 我们算法主要是用数组来模拟链表,这样效率会高一些。 数组模拟单链表 邻接表:存储图和树 实…

KubeVela篇06:Kubevela Addon插件安装原理

addon支持从本地、git仓库、helm chart仓库安装,最终原理都相同,因此我们以本地安装为例。 完整流程如下: 从指定目录读取一个完整的addon安装包。 根据metadata.yaml配置文件,校验插件要求的kubevela、k8s的版本,不满足版本要求则终止安装。 根据metadata.yaml配置文件…

深入理解 PostgreSQL 的架构和内部工作原理

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

FPGA配置文件从串并模式下载

FPGA配置文件的下载模式有5种: 主串模式(master serial)从串模式(slave serial)主并模式(master selectMAP)从并模式(slave selectMAP)JTAG模式 其中,JTAG模…

信捷PLC RC低通滤波器(C语言实现)

PLC信号处理系列之RC低通滤波器算法详细介绍请参考下面文章: PLC信号处理系列之一阶低通(RC)滤波器算法_plc滤波算法程序_RXXW_Dor的博客-CSDN博客1、先看看RC滤波的优缺点 优点:采用数字滤波算法来实现动态的RC滤波,则能很好的克服模拟滤波器的缺点; 1、在模拟常数要求较…

什么小程序需要商家自营相关类目?

1、百货:小程序主体公司综合零售商,在线售卖多种日用品,需补充商家自营-百货类目。预包装食品定义: 预包装食品,指预先定量包装或者制作在包装材料和容器中的食品;包括预先定量包装以及预先定量制作在包装…

配置右键点击文件夹通过IDEA打开项目

0、 前言 你是不是每次打开idea项目时,都需要走一遍这样的流程: 1、先启动idea 2、然后手动选择项目路径 3、打开项目 于是在打开项目的路上就耗费了大量的时间。 这篇文章会教你通过配置,让项目可以直接通过右键打开,大大提升项…

【JAVA】云HIS系统功能菜单知识(二)

随着医疗信息化和互联网技术的不断发展,云HIS在大数据管理和应用的优势日益凸显。对于医疗机构而言,云HIS平台可以帮助其实现更高效的医疗服务管理,并提高医疗服务的整体水平和效率。 一、系统管理 1.医院信息 基本信息、法人代表、主要负责…

【数据结构】链表是否有环相关问题

文章目录 快指针走3、4、5步甚至更多可以吗为什么快慢指针一定在入口点相遇![在这里插入图片描述](https://img-blog.csdnimg.cn/ba346dbc9fee425dbb895ae2962e99ce.png) 快指针走3、4、5步甚至更多可以吗 部分情况下可以。 如果这样,相对(追及&#xf…

Linux -- 进阶 自动挂载服务 ( autofs ) 介绍及安装 主配置文件分析

背景引入 : 针对于 挂载 , 大家有没有思考过一个问题,如果我们需要挂载的文件或访问的远程数据甚至只是挂载一些设备,如果太多的话,数量很大的话,那 光每次挂载 敲的 mount 命令,都得敲很多遍…

【晓风残月】byte,short,int,long——八种基本类型

文章目录 前言废话不多说,总结下今天的成果以及踩的坑 一、第一个坑【数据丢失】二、第二个坑【byte集合无法转换byte数组】三、第三个坑【Byte[]转byte[]】四、第四个坑【16进制转byte】总结快一年没写博客了,貌似都不记得过去的自己了向前看&#xff1…

DASCTF 2023 0X401七月暑期挑战赛RE题解

比赛期间没有什么时间,赛后做的题。 TCP 这题最难,耗时最久,好像做出来的人不多。 程序开始有个初始化随机数的过程,数据写入qword_5060开始的48个字节。 这里是主函数,连接到服务器以后,先接收32个字节…

spring-IOC

IOC容器 简介 IoC(Inversion of Control)控制反转,是一种基于面向对象编程法则的设计思想,它设计出的程序具有松耦合、更优良的特点。 IoC容器是Spring框架中重要的核心组件之一,贯穿了Spring从出生到成长的整个过程,Spring通过I…

K8S下如何搭建eureka集群

背景 传统应用上云,基于传统应用需要考虑上云的方案和改造成本,这也是传统应用上云过程中的难点,本篇介绍3台eureka搭建的方案。 方案一 此方案借助了K8S中Service的一些功能。 这种方案是传统方案的简单迁移版本,比较易于理解…

19.主题时钟

主题时钟 html部分 <div class"btn">黑色</div><div class"clock-container"><div class"time">21</div><div class"date">21</div><div class"clock"><div class&qu…

MOS,PCB如何添加散热孔、过孔

一、什么是 PCB 散热孔&#xff1f; 散热孔是利用贯通PCB板的通道&#xff08;过孔&#xff09;使热量传导到背面来散热的手法&#xff0c;配置在发热体的正下方或尽可能靠近发热体。 散热孔是利用PCB板来提高表面贴装部件散热效果的一种方法&#xff0c;在结构上是在PCB板上…

IMU和视觉融合学习笔记

利用纯视觉信息进行位姿估计&#xff0c;对运动物体、光照干扰、场景纹理缺失等情况&#xff0c;定位效果不够鲁棒。当下&#xff0c;视觉与IMU融合(VI-SLAM&#xff09;逐渐成为常见的多传感器融合方式。视觉信息与IMU 数据进行融合&#xff0c;根据融合方式同样可分为基于滤波…