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 分支

image.png

通过 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

image.png

我们需要在 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提交图结构如下所示:

image.png

我们需要将 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提交图结构如下所示:

image.png



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前

image.png

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

image.png

在hotfix上rebase:

image.png

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

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

相关文章

指针式仪表识别

源码下载:小宅博客网 效果如下: 工程结构: 说明: 源码是针对下面这种刻度,并且单个指针的仪表的 如果是下面这种,刻度线被连接起来的,目前不支持转换成仪表单位,只能输出指针角度&…

操作系统名词_文件下载_反弹shell_1

目录 名词解释 Poc、EXP、Payload与shellcode 后门 木马、病毒 黑白盒测试 社会工程学、撞库 ATT&CK 应用实例 实用案例1:文件上传下载-解决无图形化&解决数据传输 实用案例2:反弹shell命令-解决数据回显&解决数据通讯 结合案例1&…

构建响应式API:FastAPI Webhooks如何改变你的应用程序

FastAPI,作为一个现代、快速(高性能)的Web框架,为Python开发者提供了构建API的卓越工具。特别是,它的app.webhooks.post装饰器为处理实时Webhooks提供了一种简洁而强大的方法。在本文中,我们将探讨如何使用…

Python | python中的特殊方法__str__和__repr__

__str__和__repr__ 无方法有方法__str____repr__同时存在 __str__和__repr__都是更改print的输出形式 无方法 无特殊方法 class Person:def __init__(self,name,age):self.name nameself.age ageprint(Person(aa, 34))<main.Person object at 0x000002231EF78B38> …

【数据结构初阶】顺序结构二叉树(堆)接口实现超详解

文章目录 1.树1. 1 树的概念与结构1. 2 树的相关术语1. 3 树的表示1. 4 树形结构实际运用场景 2.二叉树2. 1 概念与结构2. 2 特殊的二叉树2. 2. 1 满二叉树2. 2. 2 完全二叉树 2. 3 二叉树存储结构2. 3. 1 顺序结构2. 3. 2 链式结构 3. 实现顺序结构二叉树&#xff08;小堆&…

麦肯锡的金字塔原理:越简单,越高效

分享下金字塔原理&#xff0c;它由麦肯锡公司的芭芭拉明托在《金字塔原理》一书中首次提出&#xff0c;旨在帮助人们通过结构化的思维分析问题&#xff0c;思考问题和解决问题。它是一种方法&#xff0c;也是一种思想。 总的来说&#xff0c;金字塔原理就是将事情归纳出一个中…

[C++进阶]AVL树

前面我们说了二叉搜索树在极端条件下时间复杂度为O(n),本篇我们将介绍一种对二叉搜索树进行改进的树——AVL树 一、AVL 树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找效率低下。因此&#xff0c;两位…

随着访问范围的扩大 OpenAI o1-mini 现已向免费用户开放

上周&#xff0c;OpenAI 展示了其最新的大型语言模型&#xff08;LLM&#xff09;–OpenAI o1及其小兄弟 OpenAI o1-mini。该公司在公告中称&#xff0c;Plus 和 Team 用户可在公告发布之日起访问该模型。企业和教育用户将在本周获得该模型&#xff0c;而免费用户最终将获得 o1…

算法题总结(一)——二分查找专题

二分查找 我们二分查找的本质就是每次能够通过中间值来进行分割&#xff0c;能够比较判断&#xff0c;查找到或者接近需要的数据&#xff0c;然后把一部分的数据丢弃掉。 原题 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &…

一键更换软件源的工具——chsrc

前言 经常用pip&#xff0c;ubuntu的apt&#xff0c;或者centos的yum等包下载工具的人不可避免的一件事就是——“更换软件源”&#xff0c;因为以上三个包下载工具的软件源一般都是默认为国外的官方网站&#xff0c;由于国情问题&#xff0c;下载速度就会非常慢&#xff0c;所…

【Linux】生产者消费者模型:基于阻塞队列,使用互斥锁和条件变量维护互斥与同步关系

目录 一、什么是生产者消费者模型 二、为什么要引入生产者消费者模型&#xff1f; 三、详解生产者消费者模型 ​编辑 生产者和生产者、消费者和消费者、生产者和消费者&#xff0c;它们之间为什么会存在互斥关系&#xff1f; 生产者和消费者之间为什么会存在同步关系&…

Flet全平台开发:软件开发界勇士为Python语言补短板的一次极具挑战性的尝试、冲刺和华丽亮相

一、Flet创始人和开发者介绍、开发Flet的背景介绍 Flet 的创始人和开发者 Feodor Fitsner 是俄罗斯人&#xff0c;就职于微软。 Flet 的第一个版本于 2022 年 6 月发布。这是一个相对较新的库&#xff0c;它基于 Flutter 框架&#xff0c;首先支持的是用 Python 语言开发软件…

fiddler抓包03_汉化

Fiddler安装后为英文界面&#xff1a; 【汉化步骤】 ​① 下载汉化文件&#xff0c;链接: https://pan.baidu.com/s/1c13Dh--TwSCbwHykO8KAug?pwd8nvn 提取码: 8nvn ② 进入Fiddler目录&#xff0c;如我的安装在E:\test\Fiddler&#xff0c;将FiddlerTexts.txt复制到E:\tes…

大模型时代:普通人如何获利

随着人工智能技术的飞速发展&#xff0c;我们正步入一个以大模型为驱动力的新时代。这些大型语言模型&#xff0c;如GPT-3和BERT&#xff0c;已经在各个领域展现出惊人的能力&#xff0c;包括文本生成、翻译、问答等。这些技术的进步不仅改变了我们的生活&#xff0c;也为普通人…

【AI学习笔记】初学机器学习西瓜书概要记录(一)机器学习基础知识篇

初学机器学习西瓜书的概要记录&#xff08;一&#xff09;机器学习基础知识篇(已完结) 初学机器学习西瓜书的概要记录&#xff08;二&#xff09;常用的机器学习方法篇(待更) 初学机器学习西瓜书的概要记录&#xff08;三&#xff09;进阶知识篇(待更) 文字公式撰写不易&#x…

以root用户登陆ubuntu的桌面环境

前言 在学习Linux的时候&#xff0c;经常都需要使用sudo权限来对配置文件进行修改&#xff0c;常用的方法就是用vim编辑器在命令行界面进行修改&#xff0c;比如sudo vim /etc/profile&#xff0c;但我觉得每次都用命令行挺麻烦的&#xff0c;于是&#xff01;&#x1f913;我…

【STL】pair 与 map:基础、操作与应用

C 标准库中提供了许多用于处理数据结构的容器和工具。pair 和 map 是两个非常有用的工具&#xff0c;广泛应用于存储和处理关联数据。在本文中&#xff0c;我们将详细介绍 pair 与 map 的相关操作&#xff0c;并结合代码实例为读者提供清晰的理解。 pair&#xff1a;成对数据的…

Docker:SpringBoot项目创建Docker镜像并推送到阿里云容器镜像仓库

0. 准备工作 os&#xff1a;macos 15.0 jdk&#xff1a;1.8 docker&#xff1a;26.0.0 1. 阿里云容器镜像服务创建实例 创建个人版 个人实例创建成功 个人镜像加速器地址 2. 安装Docker Desktop Docker Desktop是Docker的一个集成工具&#xff0c;非必须&#xff0c;过程…

Vscode运行Python无法导入自己编写的包的解决方法

前言 在Vscode编辑器中&#xff0c;我经常用于编写Python代码&#xff0c;这一过程中&#xff0c;无论是导入第三方包还是Python内置的包&#xff0c;都未曾遇到过任何问题。然而&#xff0c;当我尝试导入一个跨文件自定义的包时&#xff0c;却遭遇了导入异常的问题。这一经历…

【例题】lanqiao153 洁净数

解题思路 通过枚举1-n的数&#xff0c;判断其是否为洁净数求解。 洁净数的判断&#xff1a;i%102判断此时的个位是不是2&#xff0c;ii//10把前一位移动到个位 # 小明非常不喜欢数字 2&#xff0c;包括那些数位上包含数字 2 的数。如果一个数的数位不包含数字 2&#xff0c;…