Git rebase 的使用(结合图与案例)
目录
- Git rebase 的使用
- Git rebase 概念
- Git rebase 原理
- rebase和merge的选择
Git rebase 的使用
在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase
Git rebase 概念
**rebase概念:**用来重新应用提交(commits)到新的基础提交上
理解:
- 我们可以将其理解成改变当前分支的base;
- 比如在分支 hotfix 上执行rebase master,那么可以改变 hotfix 的base为master
**作用:**保持提交历史的线性化,避免分叉提交记录。
结合案例理解:
背景:我们需要在 c2 创建 hotfix 分支进行修复 bug
Plan1:采用 merge 来实现
git merge的操作如下所示,bug修复完后,在 master 上合并 hotfix 分支

通过 log 查看 图结构,如下所示:
nathanchen@192 rebase % git merge hotfix
Merge made by the 'ort' strategy.foo.js | 1 +1 file changed, 1 insertion(+)
nathanchen@192 rebase % git log --pretty=oneline --graph
* 64e94a94dc6464bb42fc0c4f48419479d141d335 (HEAD -> master) Merge branch 'hotfix'
|\
| * 04d6400f44b01ca420ef69bcad1a47e5310d5a6f (hotfix) hotfix commit
* | 8e3ebf3371cf5b2b95dabccfb57828f443df1f79 3 commit
|/
* ec7d26252df6bb104ea15c85e8bbbffa4fe37818 2 commit
* 132fad134c2d9e7de97fcac8d105c416afda613c 1 commit
* c90491eb34784dd0a4f98184c6d44b80a32f4120 init commit
(END)
根据以上来看, 采用git merge 来合并分支会导致分支非线性。
Plan2:采用 rebase 来实现
目前情况如下所示,当前 hotfix 分支的base为c2

我们需要在 hotfix 上进行 rebase 操作,即我们需要在 hotfix 分支上将base改成 master 指向的提交对象c3,命令如下所示:
git rebase master
整体流程如下:
nathanchen@192 rebase % git checkout hotfix
Switched to branch 'hotfix'
nathanchen@192 rebase % git rebase master
Successfully rebased and updated refs/heads/hotfix.
nathanchen@192 rebase % git log --pretty=oneline --graph
* 5a3569383a81896decb866f5333ed0abd2bd2e46 (HEAD -> hotfix) hotifx commit
* 9e5912ce9fe64627394302d8dce03958aa41bc2a (master) 3 commit
* 3971f63e84c77d0266658a61283ceafc543b0c5b 2 commit
* 959e6c99e08492212666970d2af79bc3c4378979 1 commit
* cbddbfed8dc69ddb04b19bb2fef704b6ac94b5cb init commit
(END)
nathanchen@192 rebase % git checkout master
Switched to branch 'master'
nathanchen@192 rebase % git log --pretty=oneline --graph
* 9e5912ce9fe64627394302d8dce03958aa41bc2a (HEAD -> master) 3 commit
* 3971f63e84c77d0266658a61283ceafc543b0c5b 2 commit
* 959e6c99e08492212666970d2af79bc3c4378979 1 commit
* cbddbfed8dc69ddb04b19bb2fef704b6ac94b5cb init commit
此时的git提交图结构如下所示:

我们需要将 master 指向最新的提交对象 hotfix
nathanchen@192 rebase % git merge hotfix
Updating 9e5912c..5a35693
Fast-forwardfoo.js | 3 +++1 file changed, 3 insertions(+)create mode 100644 foo.js
nathanchen@192 rebase % git log --pretty=oneline --graph
* 5a3569383a81896decb866f5333ed0abd2bd2e46 (HEAD -> master, hotfix) hotifx commit
* 9e5912ce9fe64627394302d8dce03958aa41bc2a 3 commit
* 3971f63e84c77d0266658a61283ceafc543b0c5b 2 commit
* 959e6c99e08492212666970d2af79bc3c4378979 1 commit
* cbddbfed8dc69ddb04b19bb2fef704b6ac94b5cb init commit
最终的git提交图结构如下所示:

Git rebase 原理
rebase工作原理:
首先找到这两个分支(即当前分支 hotfix、变基操作的目标基底分支 master) 的最近共同祖先 C2;
然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件;
接着将当前分支指向目标基底 C3;
最后将之前存储的临时文件的修改依序应用;
我们可以再次执行master上的合并操作:
$ git checkout master
$ git merge experiment
rebase和merge的选择
开发中对于rebase和merge的选择:
事实上,rebase和merge是对Git历史的不同处理方法:
merge用于记录git的所有历史,那么分支的历史错综复杂,也全部记录下来;
rebase用于简化历史记录,将两个分支的历史简化,整个历史更加简洁;
了解了rebase的底层原理,就可以根据自己的特定场景选择merge或者rebase。
rebase的黄金法则:永远不要在主分支上使用rebase
- 如果在main上面使用rebase,会造成大量的提交历史在main分支中不同;
- 而多人开发时,其他人依然在原来的main中,对于提交历史来说会有很大的变化;
理解以上:
rebase前

在master上rebase,会导致c3的base变成hotfix2,导致历史混乱。

在hotfix上rebase:

相关文章:
Git rebase 的使用(结合图与案例)
目录 Git rebase 的使用Git rebase 概念Git rebase 原理rebase和merge的选择 Git rebase 的使用 在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase Git rebase 概念 **rebase概念:**用来重新应用提交(commits)…...
一文讲懂Mac中的环境变量
你是否曾经因为环境变量配置不当而浪费了宝贵的开发时间?你是否好奇为什么有时候在终端输入命令会提示"command not found",而有时候又能正常运行?如果你是一名Mac用户,并且希望真正掌握环境变量的奥秘,那么这篇文章将为你揭开Mac中环境变量的神秘面纱,帮助你成为一…...
将硬盘的GPT 转化为MBR格式
遇到的问题 在重新安装系统时,磁盘遇到无法空间分配给系统。 解决方式 使用Windows10镜像 U盘安装,选择磁盘时,转换磁盘格式为MBR。然后退出安装程序。 Shift F10# 输入 diskpart# 查看磁盘信息 list disk# 选择需要转换的磁盘࿰…...
C++基于select和epoll的TCP服务器
select版本 服务器 #include <arpa/inet.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <string> #include <pthread.h> #include <sys/select…...
SpringBoot 读取配置文件的4种方式
文章目录 1. Value 注解读取单个属性2. 使用 ConfigurationProperties 注解3. 通过 Environment 对象读取属性4. 使用 PropertySource 注解加载额外的配置文件 在 Spring Boot 中,application.yml 文件用于配置应用程序的属性,Spring Boot 默认会从 src/…...
【车载开发系列】ParaSoft单元测试环境配置(三)
【车载开发系列】ParaSoft单元测试环境配置(三) 【车载开发系列】ParaSoft单元测试环境配置(三) 【车载开发系列】ParaSoft单元测试环境配置(三)一. 去插桩设置Step1:静态解析代码Step2:编辑Parasoft文件Step3:确认去插桩二. 新增测试用例Step1:生成测试用例Step2:执…...
如何让Threejs的canvas背景透明?
在Three.js中,要让Canvas的背景透明,只显示场景中的模型或物体,有两个关键点: 一、对渲染器(Renderer)进行alpha为true配置; 二、通过CSS设置,使canvas设定为透明背景模式。 以下是代…...
Text-to-SQL技术升级 - 阿里云OpenSearch-SQL在BIRD榜单夺冠方法
Text-to-SQL技术升级 - 阿里云OpenSearch-SQL在BIRD榜单夺冠方法 Text-to-SQL 任务旨在将自然语言查询转换为结构化查询语言(SQL),从而使非专业用户能够便捷地访问和操作数据库。近期,阿里云的 OpenSearch 引擎凭借其一致性对齐技术,在当前极具影响力的 Text-to-SQL 任务…...
[性能]高速收发的TCP/MQTT通信
Nagle算法是一种TCP/IP协议中的优化算法,旨在减少小数据包的数量,从而减少网络拥塞的可能性。该算法规定,在一个TCP连接上最多只能有一个未被确认的小分组。当数据被发送后,如果收到确认(ACK)之前&#x…...
OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3568移植案例(下)
往期知识点记录: OpenHarmony(鸿蒙南向开发)——轻量系统STM32F407芯片移植案例 OpenHarmony(鸿蒙南向开发)——Combo解决方案之W800芯片移植案例 OpenHarmony(鸿蒙南向开发)——小型系统STM32M…...
网络安全学习(五)Burpsuite实战
bp功能确实强大,记录一个bp手机验证码的实例。 当然,首先要打开bp,设置好浏览器的代理。 浏览器访问实例网址www.xxx.com(隐藏真实网址)。 真实网址有个注册功能,需要手机验证码。 好的,我们…...
ego-planner开源代码之simulator.xml介绍分析
ego-planner开源代码之simulator.xml介绍&分析 1. 源由2. simulator配置2.1 配置入参2.2 mockamap_node 地图生成节点2.3 quadrotor_simulator_so3 四旋翼仿真节点2.4 Nodelet机制 四旋翼控制节点2.5 odom_visualization 里程计数据2.6 pcl_render_node 本地感知 3. 总结 1…...
论文阅读笔记 --- 图模互补:知识图谱与大模型融合综述 --- 按参考文献整理
Large Language Models’ Understanding of Math: Source Criticism and Extrapolation Submitted on 12 Nov 2023大模型在处理结构化推理方面(如解决数学问题[99])表现不佳 Tree of Thoughts: Deliberate Problem Solving with Large Language Models S…...
Cpp类和对象(上)(3)
文章目录 前言一、面向过程与面向对象初步认识二、类的引入三、类的定义四、类的访问限定符及类的封装类的访问限定符类的封装 五、类的作用域(类域)六、类的实例化七、类对象模型如何计算类对象的大小类对象的存储方式猜测 八、this指针this指针的引出this指针的特性 九、C语言…...
【微信小程序】连续拍照功能实现
前言: 最近在使用uniapp开发微信小程序,遇到这样一个需求,用户想要连续拍照,拍完之后可以删除照片,保留自己想要的照片,然后上传到服务器上。由于原生的方法只能一个个拍照上传,所以只能自己通过…...
JavaSE:11、内部类
学习 资源1 学习资源 2 1、成员内部类 import com.test.*;public class Main {public static void main(String [] argv){Person personnew Person();//Person构造函数Person.Woman womanperson.new Woman();//woman构造函数} }package com.test;public class Person {publ…...
VTD激光雷达(7)——07_OptiX_Variables_Advanced
文章目录 前言一、总结 前言 一、 1 和上图蓝绿的区别在于 总结...
运维工程师面试整理-自动化运维
自动化运维是现代运维工作中不可或缺的一部分,它可以大幅提升效率,减少人为错误,并使得大规模环境管理变得可行。在面试中,面试官通常会通过自动化运维相关的问题来评估你在自动化工具使用、脚本编写、CI/CD 实践以及系统监控等方面的能力。以下是关于自动化运维的详细内容…...
【JAVA基础】实现Tomcat基本功能
文章目录 TCP/IP协议Socket编程ServletTomcat 在搜索了两三天之后,也是大概弄懂了Tomcat是个什么东西,我们在说Tomcat之前,先来了解一下下面这三个东西: TCP/IP协议 TCP/IP 是互联网通信的基础协议。TCP(传输控制协议…...
风力发电叶片缺陷检测数据集
风力发电叶片缺陷检测数据集】nc: 4 names: [Burn Mark, Coating_defects, Crack, EROSION ] 名称:【烧伤痕迹, 涂层缺陷, 裂缝,侵蚀】共1095张,8:1:1比例划分,(train;876张,val:109张ÿ…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
