详解git merge 与 git rebase的区别

作者:zzhongcy 时间:2023-04-07 20:02:49 

前言

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

merge与rebase的区别

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

详解git merge 与 git rebase的区别

merge

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

详解git merge 与 git rebase的区别

         工作原理就是: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,结果如下图三所示。 

详解git merge 与 git rebase的区别

        可以看见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 merge 与 git rebase的区别

详解git merge 与 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提交。  

详解git merge 与 git rebase的区别

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

详解git merge 与 git rebase的区别

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

详解git merge 与 git rebase的区别

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,这些工具功能基本一样,看个人喜欢好使用

来源:https://blog.csdn.net/zzhongcy/article/details/86476160

标签:git,merge,git,rebase
0
投稿

猜你喜欢

  • 像表格一样用DIV+CSS给网页布局

    2008-10-18 15:45:00
  • python使用arp欺骗伪造网关的方法

    2023-01-02 19:22:48
  • python 远程统计文件代码分享

    2023-04-13 17:02:08
  • replace MYSQL字符替换函数sql语句分享(正则判断)

    2024-01-20 15:07:43
  • 利用Python pandas对Excel进行合并的方法示例

    2022-07-31 13:39:41
  • python基于watchdog库全自动化监控目录文件

    2022-04-21 19:17:47
  • 实现一个获取元素样式的函数getStyle

    2009-02-10 10:37:00
  • python基于BeautifulSoup实现抓取网页指定内容的方法

    2022-11-29 12:11:48
  • python中字典增加和删除使用方法

    2023-12-15 15:31:30
  • python读取几个G的csv文件方法

    2023-06-04 08:01:27
  • 如何做一个优秀的设计?

    2009-02-04 15:38:00
  • Python装饰器语法糖

    2022-07-10 15:11:34
  • Python编程中用close()方法关闭文件的教程

    2023-02-10 22:10:06
  • MYSQL锁表问题的解决方法

    2024-01-19 00:53:35
  • pyqt添加启动等待界面的操作

    2023-04-29 02:27:11
  • python实现数据库跨服务器迁移

    2023-09-23 04:54:03
  • Python流程控制语句详解

    2022-03-01 22:36:37
  • ASP.NET 2.0中Gridview控件高级技巧图文教程

    2007-08-07 15:46:00
  • python对象转字典的两种实现方式示例

    2023-12-06 15:47:05
  • java正则表达式解析html示例分享

    2023-06-13 15:53:42
  • asp之家 网络编程 m.aspxhome.com