详解git merge 与 git rebase的区别

 更新时间:2020年07月31日 09:57:46   作者:zzhongcy  
这篇文章主要介绍了详解git merge 与 git rebase的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

      其实这个问题困扰我有一段时间,相信也有人和我一样有这个困扰,网上已有很多这种解释了,但是要么就是无图,要么就是解释的很乱,没太看懂,经过自己对git的使用,加上向同事请教,算是理解了这个问题,所以写下来分享一下,我尽量详细说明

merge与rebase的区别

        假设我们有如下图一所示仓库,该仓库有master和develop两个分支,且develop是在(3.added merge.txt file)commit处从master拉出来的分支。  


merge

        假设现在HEAD在(6.added hello.txt file)处,也就是在master分支最近的一次提交处,此时执行git merge develop, 结果如下图所示。 


         工作原理就是:git 会自动根据两个分支的共同祖先即 (3.added merge.txt file)这个 commit 和两个分支的最新提交即 (6.added hello.txt file) 和 (5.added test.txt file) 进行一个三方合并,然后将合并中修改的内容生成一个新的 commit,即图二的(7.Merge branch ‘develop')。 

        这是merge的效果,简单来说就合并两个分支并生成一个新的提交。

rebase

      那rebase是这么工作的呢? 

      假设初始状态也是图一所显示的。两个分支一个master,一个develop,此时HEAD在(6.added hello.txt file)处,现在执行git rebase develop,结果如下图三所示。 


        可以看见develop分支分出来分叉不见了,下面来解释一下它的工作原理: 

         在执行git rebase develop之前,HEAD在(6.added hello.txt file)处,当执行rebase操作时,git 会从两个分支的共同祖先 (3.added merge.txt file)开始提取 当前分支(此时是master分支)上的修改,即 (6.added hello.txt file)这个commit,再将 master 分支指向 目标分支的最新提交(此时是develop分支)即(5.added test.txt file) 处,然后将刚刚提取的修改应用到这个最新提交后面。如果提取的修改有多个,那git将依次应用到最新的提交后面,如下两图所示,图四为初始状态,图五为执行rebase后的状态。  



   简单来说,git rebase提取操作有点像git cherry-pick一样,执行rebase后依次将当前的提交cherry-pick到目标分支上,然后将在原始分支上的已提取的commit删除。

merge OR rebase

那什么时候用merge,什么时候用rebase呢? 

再举个例子: 

初始状态如下图六所示: 

         和之前一样的是,develop分支也是在 (3.added merge.txt file)处从master分支拉取develop分支。不一样的是两个分支各个commit的时间不同,之前develop分支的4和5commit在master分支3之后6之前,现在是develop分支的4提交早于master分支的5提交,develop分支的6提交晚于master的5提交早于master的7提交。  


在上图情况下,在master分支的7commit处,执行git merge develop,结果如下图七所示: 


执行git rebase develop,结果如下图八所示: 


1. 可以看出merge结果能够体现出时间线,但是rebase会打乱时间线。 
2. 而rebase看起来简洁,但是merge看起来不太简洁。 
3. 最终结果是都把代码合起来了,所以具体怎么使用这两个命令看项目需要。

       还有一点说明的是,在项目中经常使用git pull来拉取代码,git pull相当于是git fetch + git merge,如果此时运行git pull -r,也就是git pull –rebase,相当于git fetch + git rebase

最后推荐一些git可视化工具,我用的是gitkraken,这些工具功能基本一样,看个人喜欢好使用

到此这篇关于详解git merge 与 git rebase的区别的文章就介绍到这了,更多相关git merge与git rebase内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Apifox Echo学习curl httpie 命令使用详解

    Apifox Echo学习curl httpie 命令使用详解

    这篇文章主要为大家介绍了通过Apifox Echo学习curl httpie 命令使用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 在Postman中高效生成随机环境变量的三种高效方法

    在Postman中高效生成随机环境变量的三种高效方法

    在现代API测试中,生成真实的测试数据至关重要,作为Postman的高级用户,我发现随机数据生成不仅节省时间,还能提高测试覆盖率,本文将分享三种在Postman中生成随机环境变量的高效方法,帮助你提升API测试效率,需要的朋友可以参考下
    2025-07-07
  • 使用301永久重定向和302临时重定向作用区别详解

    使用301永久重定向和302临时重定向作用区别详解

    这篇文章主要为大家介绍了301永久重定向和302临时重定向作用详解,
    有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 高性能WEB开发 JS、CSS的合并、压缩、缓存管理

    高性能WEB开发 JS、CSS的合并、压缩、缓存管理

    本篇文章主要讨论下目前JS,CSS 合并、压缩、缓存管理存在的一些问题,然后分享下自己项目中用到的1个处理方案,并提供1个实例下载。
    2010-05-05
  • VSCode的使用配置以及VSCode插件的安装教程详解

    VSCode的使用配置以及VSCode插件的安装教程详解

    这篇文章主要介绍了VSCode的使用配置以及VSCode插件的安装教程详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • git使用教程(最详细、最傻瓜)

    git使用教程(最详细、最傻瓜)

    这篇文章主要介绍了git使用教程(最详细、最傻瓜),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 编写高质量代码的30条黄金守则(首选隐式类型转换)

    编写高质量代码的30条黄金守则(首选隐式类型转换)

    这篇文章主要介绍了编写高质量代码的30条黄金守则(首选隐式类型转换),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Visual Studio安装git插件的方法步骤

    Visual Studio安装git插件的方法步骤

    这篇文章主要介绍了Visual Studio安装git插件的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 一文了解Hive是什么

    一文了解Hive是什么

    Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类 SQL 查询功能,对Hive是什么及优缺点感兴趣的朋友跟随小编一起看看吧
    2022-05-05
  • 关于IDEA中Git暂存代码的使用

    关于IDEA中Git暂存代码的使用

    本文主要介绍了关于IDEA中Git暂存代码的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01

最新评论