Git进阶(十八):git rebase详解

news2024/11/14 15:20:50

文章目录

    • 一、前言
    • 二、rebase 图解
    • 三、应用示例
    • 四、重建提交历史
    • 五、rebase VS merge
    • 六、拓展阅读

一、前言

rebase 使用方法

git rebase [基节点] 
git rebase [基节点] [待变基节点]

rebase后面的参数可以是两个,也可以是一个,当rebase为一个参数的时候其实是省略了第二个参数,第二个参数为HEAD指针当前指向的那个节点。

二、rebase 图解

首先通过简单的提交节点图解感受一下rebase作用。

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

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

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

git checkout feature
git rebase master

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

下图为变基后的提交节点图,解释一下其工作原理:
在这里插入图片描述

  • 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进行的开发了。

三、应用示例

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

在这里插入图片描述
此时,在feature分支上执行git rebase master

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

在这里插入图片描述

四、重建提交历史

  1. 使用场景
    gitbase 的另一个功能主要用来重建提交历史,什么意思呢?你在本地commit过程中有时候可能刚提交完,然后发现有个很小的地方需要修正一下,而当你修正完之后又得提交,但是这两次提交完成的任务可能一模一样,因为第二次修改的地方实在是微不足道,或者开发一个新功能的时候分多次提交,每次的变更都很小,这个时候就可以使用git rebase的另一个功能:重建提交历史。

2.使用方法

git rebase -i [地址引用]

交互式 rebase 指的是使用带参数 --interactiverebase 命令, 简写为 -i。如果你在命令后增加了这个选项, Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于理解这个提交进行了哪些更改。在实际使用时,所谓的 UI 窗口一般会在文本编辑器 —— 如 Vim —— 中打开一个文件。

当 rebase UI界面打开时, 你能做3件事:

  1. 调整提交记录的顺序;
  2. 删除不想要的提交;
  3. 合并提交。

简而言之,它允许你把多个提交记录合并成一个。
例如:
在这里插入图片描述

C2-C5的提交都是为了完成一个功能,现在我想合并这些提交:

git rebase -i HEAD~4

这样HEAD指针就会直线后退4个节点到C1,然后列出这个节点之后你想操作的节点,C2,C3,C4,C5,之后你就可以编辑操作这些节点:变更提交顺序,删除部分提交历史等,最后得到结果:

在这里插入图片描述

三、推荐使用场景
不同公司,不同情况有不同使用场景,不过大部分情况推荐如下:

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

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

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

五、rebase VS merge

首先二者都具备整合分支间变更的能力,但二者的实现手段却大不相同。git merge总是在推进提交历史,并不会影响提交的原始状态,而git rebase整合变更的方式则是对提交历史进行重写,但从结果上看,最后git rebase形成的节点git merge`形成的节点完全相同。

rebase 优缺点
优点:

  • rebase不产生新节点,当然也不会产生新的commit日志,但是merge过程中会产生一条几乎“无用”的Merge日志。使用rebase操作的最大好处在于可以让项目提交历史变得非常干净整洁。首先,它消除了git merge操作所需创建的没有必要的合并提交。其次,rebase会造就一个线性的项目提交历史——也就是说,可以从feature分支的顶部开始向下查找到分支的起始点,而不会碰到任何历史分叉。

  • rebase产生冲突并合并冲突发生在操作git rebase时,而合并冲突这个操作是开发者自己进行的;但是提交合并申请的时候一般情况下会有评审,由评审者解决冲突,开发者人多的情况下工作量可想而知。

缺点:
rebase操作产生冲突需要依次逐个进行解决,重写提交历史可能引起混乱,对新手使用也不是很友好。

在日常的小规模项目开发中,这种差异几乎可以忽略。但是在复杂的多人协作开发场景下,随着项目迭代的不断推进和工程复杂度的不断提高,rebase往往能助力生成相对清爽的提交历史,进而方便追溯工程的演进历史和缺陷排查。

不过为了获得这种便于理解的提交历史,却需要付出两种代价:安全性可追溯性。如果不能遵循rebase的黄金法则,重写项目提交历史会为协作工作流程带来潜在的灾难性后果。再次,rebase操作丢失了合并提交能够提供的上下文信息——所以开发者就无法知道功能分支是什么时候应用了上游分支的变更。

merge 合并历史如下:

在这里插入图片描述

如果使用rebase进行合并,就会呈现出比较清爽的提交日志,也不会有那么多线,而是一条直线。

六、拓展阅读

  • 《Git进阶(十二):git merge 用法详解》

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【笔记】扩散模型(九):Imagen 理论与实现

论文链接&#xff1a;Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding 非官方实现&#xff1a;lucidrains/imagen-pytorch Imagen 是 Google Research 的文生图工作&#xff0c;这个工作并没有沿用 Stable Diffusion 的架构&#xff0c;而是级…

华夏风物 3.2.0 | 中国风物志,记录各地特产、美食、风景,旅游吃货必备

华夏风物是一款记录中国各地风物的App&#xff0c;类似于一本中国“风物志”。它记录了各地的特产、美食、风景&#xff0c;为用户提供了一个了解和探索中国文化的窗口。该应用的社区氛围非常真实&#xff0c;用户可以发现许多家乡的特色小吃和传统手艺。许多帖子由当地人发布&…

BIST(Built-in Self-Test,内建自测试)学习笔记

参考资料: 内建自测试&#xff08;Built-in Self-Test&#xff0c;简称BIST&#xff09;详解_built in self test-CSDN博客 芯片测试术语 &#xff0c;片内测试(BIST)&#xff0c;ATE测试-CSDN博客 可能是DFT最全面的介绍--BIST - 知乎 (zhihu.com) 汽车功能安全--TC3xx LB…

【Ubuntu24.04】从双系统到虚拟机再到单系统的故事

故事 在大学前期&#xff0c;我使用Ubuntu系统都是为了学习一些命令或者其它Linux的东西&#xff0c;对性能的要求不高&#xff0c;所以选择了虚拟机&#xff0c;后来为了做毕设&#xff0c;选择安装了Ubuntu20.04双系统&#xff0c;因为虚拟机实在带不动&#xff0c;那时我的主…

AntFlow一款开源免费且自主可控的仿钉钉工作流引擎

在现代企业管理中&#xff0c;流程审批的高效性直接影响到工作的流畅度与生产力。最近&#xff0c;我发现了一个非常有趣的项目——AntFlow。这个项目不仅提供了一个灵活且可定制的工作流平台&#xff0c;还能让用户以可视化的方式创建和管理审批流程。 如果你寻找一个快速集成…

科学计算服务器:如何计算算力?如何提升科学研究效率?

在现代科学研究的舞台上&#xff0c;科学计算服务器犹如一位强大的幕后英雄&#xff0c;为复杂科学计算任务的攻克提供着坚实支撑。准确计算其算力并充分发挥优势&#xff0c;对提升科学研究效率意义非凡。 服务器的中央处理器&#xff08;CPU&#xff09;计算力。在科学计算服…

Java String字符串

Java字符串通常被视为一种数据类型&#xff0c;但由于它们按顺序存储字符类型的元素&#xff0c;类似于数组&#xff0c;因此也常被视为数据结构。在本文中&#xff0c;我们将通过以下大纲简明地了解有关Java字符串的所有内容。 什么是Java字符串&#xff1f;如何创建Java字符…

leetcode25:k个一组链表反转

给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值…

《⼆叉搜索树》

《⼆叉搜索树》 1. ⼆叉搜索树的概念2. ⼆叉搜索树的性能分析3 二叉树的功能说明及实现3.1 ⼆叉搜索树的插⼊3.2 ⼆叉搜索树的查找3.3 ⼆叉搜索树的删除 4二叉搜索树的实现代码5 ⼆叉搜索树key和key/value使⽤场景5.1 key搜索场景&#xff1a;5.2 key/value搜索场景&#xff1a…

势不可挡 创新引领 | 生信科技SOLIDWORKS 2025新品发布会·苏州站精彩回顾

2024年11月01日&#xff0c;由生信科技举办的SOLIDWORKS 2025新产品发布会在江苏苏州圆满落幕。现场邀请到制造业的专家学者们一同感受SOLIDWORKS 2025最新功能&#xff0c;探索制造业数字化转型之路。 在苏州站活动开场&#xff0c;达索系统专业客户事业部华东区渠道经理马腾飞…

Spark 程序开发与提交:本地与集群模式全解析

Spark 的介绍与搭建&#xff1a;从理论到实践-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 目录 一、本地开发与远程提交测试 &#xff08;一&#xff09;问题背景 &#xff08;二&#xff09;解决方案 集群环境准…

童装类目电商代运营公司——品融电商

童装类目电商代运营公司——品融电商 随着电商行业的快速发展&#xff0c;童装类目已成为市场中极具潜力的细分领域之一。消费者对童装的需求不仅限于基本穿着功能&#xff0c;更倾向于选购具有设计感、安全性和舒适度的产品。童装类目涵盖婴儿服、儿童套装、家居服、户外服饰等…

利用pythonstudio写的PDF、图片批量水印生成器,可同时为不同读者生成多组水印

现在很多场合需要将PDF或图片加水印&#xff0c;本程序利用pythonstudio编写。 第一步 界面 其中&#xff1a; LstMask:列表框 PopupMenu:PmnMark LstFiles:列表框 PopupMenu:PmnFiles OdFiles:文件选择器 Filter:PDF文件(.PDF)|.PDF|图像文件(.JPG)|.JPG|图像文件(.png…

PDF模板制作与填充(Java)

1.PDF模板制作 准备原始模板 准备一个原始PDF模板&#xff0c;可以编辑好Word&#xff0c;预留出要填充的部分&#xff0c;再转换成PDF格式。 设置表单域 用任意PDF编辑器打开PDF模板文件&#xff0c;设置表单域&#xff0c;下面以WPS为例&#xff1a; 拖动文本域到需要填充的…

kafka中节点如何服役和退役

服役新节点 1&#xff09;新节点准备 &#xff08;1&#xff09;关闭 bigdata03&#xff0c;进行一个快照&#xff0c;并右键执行克隆操作。 &#xff08;2&#xff09;开启 bigdata04&#xff0c;并修改 IP 地址。 vi /etc/sysconfig/network-scripts/ifcfg-ens33修改完记…

笔记本怎么开启TPM2.0_笔记本开启TPM2.0教程(不同笔记本开启tpm2.0方法)

在win11最低要求是提示&#xff0c;电脑必须满足 TPM 2.0&#xff0c;并开需要开启TPM 才能正常安装windows11系统&#xff0c;有很多笔记本的用户问我&#xff0c;笔记本怎么开启tpm功能呢&#xff1f;下面小编就给大家详细介绍一下笔记本开启tpm功能的方法。 如何确认你笔记本…

【PyTorch项目实战】图像分割 —— U-Net:Semantic segmentation with PyTorch

文章目录 一、项目介绍二、项目实战2.1、搭建环境2.1.1、下载源码2.1.2、下载预训练模型2.1.3、下载训练集 2.2、环境配置2.3、模型预测 U-Net是一种用于生物医学图像分割的卷积神经网络架构&#xff0c;最初由Olaf Ronneberger等人于2015年提出。 论文&#xff1a; U-Net: Con…

开源竞争-大数据项目期末考核

开源竞争&#xff1a; 自己没有办法完全掌握技术的时候就开源这个技术&#xff0c;培养出更多的技术依赖&#xff0c;让更多人完善你的技术&#xff0c;那么这不就是在砸罐子吗&#xff1f;一个行业里面总会有人砸罐子的&#xff0c;你不如先砸还能听个想。 客观现实&#xf…

11月7日星期四今日早报简报微语报早读

11月7日星期四&#xff0c;农历十月初七&#xff0c;早报#微语早读。 1、河南&#xff1a;旅行社组织1000人次境外游客在豫住宿2夜以上&#xff0c;可申请激励奖补&#xff1b; 2、主播宣称下播后商品恢复原价构成欺诈&#xff0c;广州市监&#xff1a;罚款5万元&#xff1b;…

HTMLCSS:3D 旋转卡片的炫酷动画

效果演示 这段代码是一个HTML和CSS的组合&#xff0c;用于创建一个具有3D效果的动画卡片。 HTML <div class"obj"><div class"objchild"><span class"inn6"><h3 class"text">我是谁&#xff1f;我在那<…