首页 > 其他分享 >git rebase 详解

git rebase 详解

时间:2022-11-14 17:35:25浏览次数:71  
标签:git rebase feature 详解 master 提交 分支

https://blog.csdn.net/weixin_42310154/article/details/119004977
图解 Git 基本命令 merge 和 rebase

0 引言

网上有太多讲rebase和merge的文章,但大多都是复制粘贴没有自己的理解,而且很多博客的例子写的过于复杂,让人没兴趣看下去。本文举最简洁的例子,大白话几句就让你快速掌握rebase的核心原理和用法。

1 提交节点图解

两个分支master和feature,其中feature是在提交点B处从master上拉出的分支

master上有一个新提交M,feature上有两个新提交C和D

image-20221019222642953

此时切换到feature分支上,执行如下命令,相当于是想要把master分支合并到feature分支(这一步的场景就可以类比为我们在自己的分支feature上开发了一段时间了,准备从主干master上拉一下最新改动)

git checkout feature
git rebase master
# 这两条命令等价于 git rebase master feature

下图为变基后的提交节点图,解释一下其工作原理:

image-20221019222711349
  • feature:待变基分支、当前分支
  • master:基分支、目标分支

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

结合例子解释:当在feature分支上执行git rebase master时,git会从master和featuer的共同祖先B开始提取feature分支上的修改,也就是C和D两个提交,先提取到。然后将feature分支指向master分支的最新提交上,也就是M。最后把提取的C和D接到M后面,但这个过程是删除原来的C和D,生成新的C’和D’,他们的提交内容一样,但commit id不同。feature自然最后也是指向D’。

通俗解释❗️:rebase,变基,可以直接理解为改变基底。feature分支是基于master分支的B拉出来的分支,feature的基底是B。而master在B之后有新的提交,就相当于此时要用master上新的提交来作为feature分支的新基底。实际操作为把B之后feature的提交存下来,然后删掉原来这些提交,再找到master的最新提交位置,把存下来的提交再接上去(新节点新commit id),如此feature分支的基底就相当于变成了M而不是原来的B了。(注意,如果master上在B以后没有新提交,那么就还是用原来的B作为基,rebase操作相当于无效,此时和git merge就基本没区别了,差异只在于git merge会多一条记录Merge操作的提交记录)

上面的例子可抽象为如下实际工作场景:
张三从B拉了代码进行开发,目前提交了两次,开发到D了;李四也从B拉出来开发了并且开发完毕,他提交到了M,然后合到主干上了。此时张三想拉下最新代码,于是他在feature分支上执行了git rebase master,即把master分支给rebase过来,由于李四更早开发完并合了主干,如此就相当于张三是基于李四的最新提交M进行的开发了。

2 实际git提交示例

按照上面的图解构造了提交记录,如下图所示:(ABM是master分支线,ABCD是feature分支线。这里画成了master变色分叉出来,这不影响理解,知道是表示两个分支两条线即可!)

image-20221019225305240

此时,在feature分支上执行git rebase master

变基完成以后,ABCD是原来的feature分支线,ABMC’D’是新的feature分支线,ABM是master分支线(没有变化)

image-20221019225548871

3 推荐使用场景

搞来搞去那么多,这其实是最重要的。不同公司,不同情况有不同使用场景,不过大部分情况推荐如下:

自己单机的时候,拉公共分支最新代码的时候使用rebase,也就是git pull -r或git pull --rebase。这样的好处很明显,提交记录会比较简洁。但有个缺点就是rebase以后我就不知道我的当前分支最早是从哪个分支拉出来的了,因为基底变了嘛,所以看个人需求了。

往公共分支上合代码的时候,使用merge。如果使用rebase,那么其他开发人员想看主分支的历史,就不是原来的历史了,历史已经被你篡改了。举个例子解释下,比如张三和李四从共同的节点拉出来开发,张三先开发完提交了两次然后merge上去了,李四后来开发完如果rebase上去(注意李四需要切换到自己本地的主分支,假设先pull了张三的最新改动下来,然后执行<git rebase 李四的开发分支>,然后再git push到远端),则李四的新提交变成了张三的新提交的新基底,本来李四的提交是最新的,结果最新的提交显示反而是张三的,就乱套了。

正因如此,大部分公司其实会禁用rebase,不管是拉代码还是push代码统一都使用merge,虽然会多出无意义的一条提交记录“Merge … to …”,但至少能清楚地知道主线上谁合了的代码以及他们合代码的时间先后顺序

4 总结

无论是个人开发,还是公司协作开发,只要没有特殊需求,用merge准没错!!

标签:git,rebase,feature,详解,master,提交,分支
From: https://www.cnblogs.com/angelia-wang/p/16889704.html

相关文章

  • Pod详解之Pod生命周期
    Pod生命周期我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期,它主要包含下面的过程:-pod创建过程-运行初始化容器(initcontainer)过程-运行主容器(mainc......
  • 详解 Spark Core 调优之数据倾斜调优(建议收藏)
    大家好,我是梦想家Alex,今天我想给大家分享一篇详解SparkCore调优的文章,本文较长,可以先收藏转发,再细细阅读....文章目录一、调优概述二、数据倾斜发生时的现象三、数据倾......
  • 正向代理与反向代理详解
    代理?我知道啊,不就是vue项目里面config文件配置的proxy嘛,我向后端接口请求数据的时候就配置它,反正能解决跨域这个问题......今天我们来讲讲代理这些事情,虽然我们知道,但是我......
  • Android自定义定时闹钟开发详解
    这篇文章主要为大家详细介绍了Android自定义定时闹钟开发,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下本文实例为大家分享了Android开发之自......
  • 一年一度!GitHub 开发者大会「GitHub 热点速递 v.22.45」
    一年一度!GitHub开发者大会「GitHub热点速递v.22.45」 GitHub是全球最大的开源社区,它的一举一动都深受每一位开源爱好者的关注。这周末刚落下帷幕的《GitHubUniv......
  • Linux sar命令详解:分析系统性能
    sar命令很强大,是分析系统性能的重要工具之一,通过该命令可以全面地获取系统的CPU、运行队列、磁盘读写(I/O)、分区(交换区)、内存、CPU中断和网络等性能数据。sar命令的基本......
  • Python 自动化中三种等待时间的详解
    自动化测试,是交由机器来执行的一种测试手段,用于提升测试效率,意味着每一次的自动化测试都需要有非常高的成功率,才可以达到提升效率的作用。在自动化测试中,其实就是通过代码......
  • 访问github的加速器:Watt Toolkit教程
    WattToolkit教程想访问github网址,必须用加速器,选用WattToolkit软件加速第一步:官网:https://steampp.net/打开官网,下载Windows版,安装到D盘。   第二......
  • C++ 位运算Bitwise operations详解 ----- 重要的解题技巧
    什么是位运算:利用位运算符号进行二进制位计算的操作即为位运算维基百科:......
  • 关于memset函数的详解
    一般用于数值和结构体的初始化这里仅仅说明对数组的初始化函数原型void*memset(void*s,intch,unsignedn);作用将s所指向的某一块内存中的每个字节的内容全部......