git高级用法之rebase

2023-11-19

rebase的高级用法,这里介绍两种高级用法:
1、合并连续的或者不连续的两个提交记录、删除任意一个提交记录、改变提交记录的先后顺序
2、通过rebase合并分支。

合并连续的两个提交

如下图的场景:(gl是git log的缩写,不过也没这么简单,要设置类似下图中简洁的log,可以参考本人博客中的文章【git配置】)
在这里插入图片描述
第一次提交了某个功能的修改,后面又优化了一些,这样同一个功能有两个提交记录,有点辣眼睛。这时我们可以用rebase来合并两个提交:

git rebase -i 0f31175

提示:各位需要重点注意上述命令中最后的参数。这个值,需要是我们待操作的记录的前一次提交的hash值。这个在rebase所有操作中都是如此的规律。这个值是告诉git,后面的操作是基于哪个提交进行的。在接下来的介绍中,我们把这个基础版本定为base版本,用base代指这个提交节点。
输入rebase命令后,会弹出类似如下的提示:
在这里插入图片描述
我们要把【又修改函数func_1】合并到【修改函数func_1】一起,所以根据上述图片注释中的提示,我们把【又修改函数func_1】前面的pick改成squash,或者直接简写s也行。如下所示:
在这里插入图片描述
然后保存退出,会弹出类似如下提示:
在这里插入图片描述
这里是让我们编辑合并后的提交日志的,我们可以把第二行【又修改函数func_1】删掉,只保留上面的一行即可,然后保存退出。这时,如果没有冲突,git会提示success:
在这里插入图片描述
如果没有冲突,即成功之后,我们看下log:
在这里插入图片描述
会发现两个提交只剩一个了,他们是合并了,而不是删除了某一个。各位可以用git show 01e5706看下合并后的提交内容即可。

合并两个提交,是rebase应用中最简单的一个,也是最基础的一个,所以这里我稍微说的详细一些。上面多次提到没有冲突的情况下这几个字眼,就是说,我们这次演示是没有冲突的,在平时的使用中是可能会出现有冲突的情况的,这个时候rebase会失败。失败之后有两种解决方法,一种是直接abort,另一种方法是解决冲突之后继续rebase。
abort的方法是,当出现冲突后,在命令行输入

git rebase --abort

然后一切就回到没有rebase之前的状态了。
解决冲突的方法,和git通用的解决冲突类似,解决完冲突后,输入:

git rebase --continue

就可以接着走被打断的rebase流程。

合并两个不连续的提交

如下图的场景:
在这里插入图片描述
在提交了某些功能之后,又修改了之前某个功能。我想把这两次合并,来看rebase如何出色的完成。
这个我们得分两步进行:
1、将【又又又修改函数func_1】的提交记录移动到www和eee之前,即和【修改函数func_1】放在一起,而且要放在【修改函数func_1】的后面,即:要看起来是先提交了【修改函数func_1】,然后提交了【又又又修改函数func_1】;
2、使用上面介绍的方法,将两个提交合并为一个提交。
下面开始实施。
第一步:修改顺序。根据rebase的提示,我们是可以改变提交的顺序的。我们使用0f31175版本作为base,使用如下命令:

git rebase -i 0f31175

然后弹出:
在这里插入图片描述
我们编辑这个文本,将【又又又修改函数func_1】所在行移动到【修改函数func_1】下面。这个顺序十分重要,因为git会根据这里的顺序从上到下依次在base版本基础上依次提交列出来的记录。
修改后如下所示:
在这里插入图片描述
rebase原理小透漏:我们这样改了之后,git内部会先回退到base版本,然后按照我们修改后的顺序依次提交。所以rebase之后,在base之后每个提交的hash值都变了,而在包括base在内的之前的版本,hash值都不变。

我们保存提交:
在这里插入图片描述
可以看到,顺序已经如我们所愿的调整了。
第二步:根据上面介绍的,使用rebase合并提交的方法,将【又又又修改函数func_1 】合并到【修改函数func_1】中即可。

删除提交

到这里,就不用详细介绍了。如下所示,要把【扯淡的需求】这个提交删掉:
在这里插入图片描述
我们把2d68911作为base版本,输入:

git rebase -i 2d68911

在这里插入图片描述
如上图所示,将要删除的行前面的pick改为d,然后保存退出即可,然后看log:
在这里插入图片描述
可以看到,扯淡的需求已经被删掉了。

通过rebase合并分支

有同学可能会说,合并分支用git merge不挺好吗?但是你有没有发现,如果用merge,很可能每merge一次,都会多出来一个merge的记录。会导致提交记录很不美观。如下图所示是用merge合并分支的效果:
在这里插入图片描述
如果是用rebase合并分支,是不会有这些多余的提交记录的,只会完成真正意义上的合并。
这里提一句,为什么merge提交会导致多出来一个提交呢?merge有两种合并模式,一种是fast forward模式,一种是三路合并模式。当使用三路合并模式的时候,会多出来一个提交,而使用fast forward模式的时候,不会多出来额外的提交。以上图中的分支master和develop为例说明这两种模式。我们假设develop分支是从master分支某个base节点基础上创建的新分支,如果在base节点之后,master分支上没有任何提交,而只有develop分支在base节点上有一些提交,那么这时,通过merge将develop分支合并到master分支,merge会使用fast forward模式,且不会在master上产生多余提交。但是,如果在base节点之后,master和develop分支都各自有所提交,那么将develop分支合并到master分支上的时候,git就会采用三路合并的方式merge,并且合并完后,会生成一个多余的节点。

所以,如果在base节点之后,master分支上没有任何提交,我们完全可以使用merge合并分支,因为这时git会采用fast forward模式merge,不会产生一个多余的节点。但是当我们预判出git要采用三路合并的方式merge的时候,这时就可以采用rebase合并,来避免git产生多余的节点。

我们先来演示一下rebase合并:
在这里插入图片描述
上图展示了当前master分支和develop分支目前的情况。两个分支在【base_版本】基础上都各自有所提交,现在我想把develop分支上的提交合并到master分支上,需要以下两步:

git co develop     //切换到develop分支
git rebase master    //以master分支最新提交为base,将develop分支上独有的提交在base基础上依次提交一遍。

执行rebase后,git会打印重新提交的过程:
在这里插入图片描述
可以看到,git依次在base基础上提交了develop分支上独有的。
接下来看看develop分支的记录:
在这里插入图片描述
可以看到,develop分支原来独有的提交,现在都在master分支之后了。
但是注意:上述操作后,develop分支上新的提交依然在develop分支上,并没有合并到master分支上,要完成合并,还需要使用merge,不过此时merge是fast forward模式的,不会产生新的多余节点。
在这里插入图片描述
最终看下master分支上的log:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

git高级用法之rebase 的相关文章

随机推荐

  • IIS7.5文件解析漏洞&&Apache解析漏洞&&Nginx文件解析漏洞&&

    实验原理 文件上传使用白名单做限制 只能上传图片文件 导致脚本文件无法上传 上传图片马绕过白名单文件上传的验证 但是图片马又无法解析 利用IIS7 5文件解析漏洞的特点 任意文件名 任意文件名 php 从而解析脚本文件 实验步骤 1 登录操
  • 怎样使用Finder从MacOS Catalina删除iPhone和iPad备份?

    是否需要清理一些磁盘空间或摆脱Mac上的某些旧iPhone或iPad备份 备份iPhone或iPad最安全 最彻底的方法是通过Mac Finder进行加密备份 以下是在macOS Catalina中删除旧的iPhone或iPad备份的方法
  • 通过matlab实现数字图像处理中的抠图换背景功能

    适合背景为蓝色的图片 效果最好 如果背景色为别的颜色 可对代码进行调整修改后使用 其实这里的代码最开始由于报错已经经过我的修改了 可能出现的异常情况 1 待抠图片以及需要替换的背景图片放置在代码文件所在的目录 不然会无法读取 不出结果 2
  • 【安全】Apache HDFS 上配置 kerberos

    文章目录 4 3 部署kerberos keytab文件 4 4 命令测试 4 5 写个测试类测试一下 4 5 修改 hdfs 配置文件 4 5 1 常规配置 4 5 2 可选配置 4 5 2 可选配置 4 5 3 可选配置 4 5 4 注
  • ubantu16.04安装Anaconda

    1 官网下载安装包 我下载的是python 3 10版本的 后续用tvm要求python版本在 3 7 3 8 记得创建一个虚拟环境 Anaconda历史版本链接 https repo anaconda com archive 2 开始安装
  • 【项目实战】复旦微MCU+RT-thread+Moudbus(1)

    前言 手头存货FM33LC046芯片 复旦微提供的是freertos和rthread nano的例子 一直想使用RTThread完整版 MCU由于ROM有限 项目因此不可能太复杂 怕后期资源不够 第一步 git源码https gitee c
  • Activiti-设置全局变量的四种方法

    1 在流程启动的时候设置全局变量 在流程启动时设置全局变量 Test public void startProcessInstance 得到runtimeService RuntimeService runtimeService proce
  • 如何在Controller层实现事务管理?

    在spring aop 事务管理中发现 我们是在service层实现的事务管理 现在有如下场景 大家讨论下看如何实现 ControllerA ControllerB ControllerC 共同依赖ServiceA ServiceB 上述C
  • Java特训的第一天——开篇

    我是一名刚入门的Java菜鸟 我选择Java的原因是因为其语法简单 功能强大 从web 到桌面 到嵌入式 无所不能 下面我将谈一谈我对Java语言的认识 Java语言概述 关于Java的介绍网上有很详细的阐述 我在这里就不再细述了 下面只简
  • 非谓语动词

    文章目录 1 to 动词原形或动词原形 ing 1 1 动词不定式 1 2 动名词 2 假主语 真主语和不定式 动名词的否定式 2 1 形式主语 2 2 形式宾语 2 3 动名词或不定式否定 3 to不定式表示目的 4 常见的不定式和动名词
  • 【vue网站优化】秒开网页

    vue网站优化 网页渲染速度快到极致 在将打包后的dist目录上传到服务器时 往往会出现首次加载页面速度较慢的情况 以下给出几点优化意见 在路由配置文件中 采用路由懒加载 当打包构建应用时 JavaScript 包会变得非常大 影响页面加载
  • SQL注入的常见方式

    目录 联合查询 union 函数介绍 order by union select 操作 布尔盲注 and or 函数介绍 mid 从中间截取字符 left 从左开始截取字符 ord ascii 转成ascii码 length 统计长度 an
  • 循环嵌套与简单调用

    循环嵌套与简单调用 一 循环嵌套 1 循环嵌套 for 条件初始化 条件判断 条件变化 重复执行的代码 for 条件初始化 条件判断 条件变化 重复执行的代码 重复执行的代码 特点 外层循环执行一次 内层小循环执行一轮 从开始到结束 外层循
  • C0202 [2010普及组-A]数字统计(C语言写)

    题目描述 请统计某个给定范围 L R 的所有整数中 数字 2 出现的次数 比如给定范围 2 22 数字 2在数 2 中出现了 1 次 在数 12 中出现 1 次 在数 20 中出现 1 次 在 数 21中出现 1 次 在数 22 中出现 2
  • QT5.15编译2

    准备工作 必须 第一步 Qt 源码下载 https download qt io official releases qt Qt Creator 源码下载 https download qt io official releases qtc
  • RabbitMQ重复消费

    文章目录 前言 重复消费问题 方法一 消息幂等性 方法二 消息去重 前言 解决 RabbitMQ 重复消费问题是消息队列应用中非常重要的一部分 在实际应用中 可能会出现消费者因某种原因 例如网络问题 应用崩溃等 在处理消息时失败 然后重新开
  • 4.2.1测试网络基础结构配置

    测试网络基础结构配置 ID WSTG CONF 01 总结 互连和异构 Web 服务器基础结构 可能包括数百个 Web 应用程序 的内在复杂性使得配置管理和审查成为测试和部署每个应用程序的基本步骤 只需要一个漏洞就可以破坏整个基础架构的安全
  • HTTP(GET/POST)请求过程中的编码问题

    一 问题 编码问题是JAVA初学者在web开发过程中经常会遇到问题 网上也有大量相关的文章介绍 但其中很多文章并没有对URL中使用了中文等非ASCII的字 符造成服务器后台程序解析出现乱码的问题作出准确的解释和说明 本文将详细介绍由于在UR
  • MATLAB中的eps的详细解释及用法

    1 首先 eps是一个函数 它表示的是一个数可以分辨的最小精度 默认时它表示1到它下一个浮点数之间的距离的一半 而正好等于最大小于1的浮点数到最小大于1的浮点数之间的距离 eps 2 2204e 16 下面是eps的默认精度 注 以下演示环
  • git高级用法之rebase

    rebase的高级用法 这里介绍两种高级用法 1 合并连续的或者不连续的两个提交记录 删除任意一个提交记录 改变提交记录的先后顺序 2 通过rebase合并分支 合并连续的两个提交 如下图的场景 gl是git log的缩写 不过也没这么简单