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

这篇具有很好参考价值的文章主要介绍了【Git】分支合并&冲突产生与解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

前言

合并操作在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合并冲突解决,Git学习,git

执行命令
git checkout master
git merge bugfix

合并后描述
master指针快速移动到bugfix指针所指向的commit对象C3
git合并冲突解决,Git学习,git

合并过程中发生的事情

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

fast-forward为什么不会产生冲突
冲突产生的原因:多个分支同一个文件同一部分进行了修改,并且这些修改是相互矛盾的,无法自动合并。而fast-forward只有一个分支对文件做了修改(bugfix)

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合并冲突解决,Git学习,git

执行命令
git checkout master
git merge bugfix

此时会跳转到一个vim界面,编辑本次merge包括了哪些信息,这个自己填写就可以
git合并冲突解决,Git学习,git

合并后描述
产生一个新的commit对象C5,它的parent有两个,C3与C4,同时master指针指向C5,合并完成
git合并冲突解决,Git学习,git

2.3 带冲突的three way merge

合并前描述
master和bugfix对同一文件的同一区域进行了修改,现在要将bugfix分支合并到master
git合并冲突解决,Git学习,git
执行命令
git checkout master
git merge bugfix

此时会显示如下冲突信息
git合并冲突解决,Git学习,git

此时也可以使用git status来查看有哪些文件产生了冲突
git合并冲突解决,Git学习,git
然后可以使用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
git合并冲突解决,Git学习,git
有些人就觉得,不行,必须得是直线才好看,也就是想在3 way merge的方式下还想达到fast forward的效果(fast forward在git 历史上是直线),所以产生了git rebase

3.2 核心原理

核心原理:将一个分支的修改“移动”到另一个分支上,使得两个分支的修改可以按照时间顺序排列,从而形成一个线性的提交历史

基本步骤
git合并冲突解决,Git学习,git
在 rebase完之后,可以checkou 到master执行merge操作,完成合并。
注意:rebase的过程中也是有可能产生冲突的,解决完冲突之后 使用git rebase --continue继续rebase

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 解决冲突

git合并冲突解决,Git学习,git

git合并冲突解决,Git学习,git
git合并冲突解决,Git学习,git文章来源地址https://www.toymoban.com/news/detail-763105.html

到了这里,关于【Git】分支合并&冲突产生与解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何解决Git合并分支造成的冲突

    一、造成冲突的场景         在我们在参与项目开发的时候,通常会创建公共的文件,但是当我们编码完成,使用git进行分支合并时,往往会出现合并冲突,也就是负责不同部分的开发人员会对同一个文件的同一个部分进行修改,这个时候就需要我们解决合并造成的冲突

    2023年04月23日
    浏览(62)
  • 【Git教程】(六)分支合并 —— 合并过程,各类合并冲突及解决思路 ~

    使用 merge 命令来进行分支合并是 Git 中最重要的操作之一。虽然这一操作的底层算法很复杂,但调用起来却很简单。我们可以通过指定分支名称来选择待合并修改的分支。然后, Git 会基于合并的内容来创建一次新的提交。 下面,我们来看下图中的这个例子:在一群开发者在

    2024年04月25日
    浏览(48)
  • Git入门实战教程之合并分支并解决冲突

    在开发过程中,难免会遇到代码冲突的情况,那么该如何处理呢? 分支策略: 首先master主分支应该是非常稳定的,也就是用来发布新版本,一般情况下不允许在上面干活,干活一般情况下在新建的dev分支上干活,干完后,比如上要发布,或者说dev分支代码稳定后可以合并到

    2024年04月10日
    浏览(50)
  • idea解决代码冲突-git分布式合并分支-加git回滚操作

    第一次接触项目发版的工作,记录一下解决版本冲突合并问题的心得。 适用场景:分布式项目,多人使用自己分支开发,最后合并自己的代码分支给主分支。 话不多说,直接看图 1.全部拉下来(这个拉取是全部拉取,既保证自己的分支最新,同时也把远端的分支都拉到最新

    2024年02月08日
    浏览(104)
  • Git管理神器SourceTree使用教程详解(连接远程仓库,克隆,拉取,提交,推送,新建/切换/合并分支,冲突解决,提交PR)

    俗话说的好工欲善其事必先利其器,Git分布式版本控制系统是我们日常开发中不可或缺的。目前市面上比较流行的Git可视化管理工具有SourceTree、Github Desktop、TortoiseGit,综合网上的一些文章分析和自己的日常开发实践心得个人比较推荐开发者使用SourceTree,因为SourceTree同时支持

    2024年02月03日
    浏览(246)
  • 【Git】在idea中多分支开发如何——合并分支、处理冲突

    博主简介: 22级计算机科学与技术本科生一枚🌸 博主主页:是瑶瑶子啦 每日一言🌼: “人间总有一两风,填我十万八千梦” 我当前开发的分支—— hfy 我想将 subject 分支的最新代码拉取合并到 hfy 分支 点击之后会出现界面,有需要你处理的冲突( 冲突的处理的本质就是:你

    2024年04月17日
    浏览(74)
  • git的分支的使用,创建分支,合并分支,删除分支,合并冲突,分支管理策略,bug分支,强制删除分支

    查看当前本地仓库中有哪些分支 HEAD所指向的分支就是当前正在工作的分支 创建一个分支 创建好了,但是目前还是指向 master 用tree命令也可以看到已经创建分支成功了 创建出来的分支,和主分支的最新记录是一样的 切换分支就是让HEAD指向我们的dev分支 我们在dev分支上堆R

    2024年02月04日
    浏览(58)
  • 多分支Git的操作简介,冲突合并,多平台对应

    在使用git管理代码时,在多人开发,或者不同功能开发以及环境测试时,需要保持master代码的稳定性,因此往往需要创建多分支的Git仓库,这里记录一些多分支仓库的操作指令 1. 分支操作 1.1 创建分支 上述输入想要创建的分支名字,即可在本地创建分支,如 即可以在本地创

    2024年01月22日
    浏览(47)
  • git中合并分支时出现了代码冲突怎么办

    友情提醒: ①git merge命令介绍 git merge 用于本地分支的合并。将一个本地分支的更改合并到另一个本地分支时,你会使用git merge命令。 git merge命令用于将一个分支的更改合并到另一个分支。它会将两个分支的更改整合在一起,保留详细的合并信息,并成为一个新的提交。 例如

    2024年03月20日
    浏览(80)
  • git ----拉去远端仓库产生冲突的解决方式

    # 出现冲突的原因     -1 多人在同一分支,修改了同一个地方的代码,出现的冲突     -2 分支合并时出冲突                     # 1 多人统一分支开发,修改了同样的代码          -某人修改了1.txt的第四行,提交了     -我操作:         -修改了1.txt第四行        

    2024年02月10日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包