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 的相关文章

  • 为什么会导致合并冲突?

    这是我的 git 存储库的初始快照 在树枝上master file m1包含 L1 在树枝上dev file m1包含 L1 L2 如果我尝试合并dev from master 这会导致冲突 git checkout master Swit
  • 执行 rebase 后,Git 提交会在同一分支中重复

    我理解 Pro Git 中提出的场景是关于变基的危险 https git scm com book en v2 Git Branching Rebasing rebase peril 作者基本上告诉你如何避免重复提交 不要对已推送到公共存储
  • 如何启用非 docker 操作来访问我的自托管 github 操作运行器上 docker 创建的文件? (无根码头工人)

    Github 建议以非 root 用户身份运行他们的运行程序 这引起了一些问题围绕混合 docker 和非 docker 操作的问题 https github com actions runner issues 434 这非常烦人 因为它导
  • Jenkins 的 Gerrit 触发器找不到任何要构建的修订

    我在使用 Jenkins Gerrit 时遇到问题 这是我到目前为止得到的 Jenkins 中的 Gerrit 触发器配置似乎没问题 当我推送新的变更集时 Jenkins 构建就会启动 我用过这个 Jenkins Gerrit 触发器问题的
  • 如何将 git 存储库转换为 Mercurial?

    我一直在使用 git 作为源代码存储库开发 java 应用程序 我想与其他 java 开发人员分享该项目 hg 似乎是他们最常用的 我的问题是如何将 git 存储库转换为 hg 如果我尝试谷歌搜索 将 git 转换为 hg 并且每次搜索命中
  • 将 jQuery 与托管在 Github 页面上的 Jekyll 站点结合使用

    我有一个简单的 Jekyll 博客托管在 github 页面上 我已经包含了 jQuery 和 tablesorter 插件 但遇到了错误 据我所知 这个错误是由于没有以正确的顺序加载 jQuery 引起的 我的下图显示代码的顺序是正确的
  • 将 sourceforge 票证迁移到 GitHub 问题 [重复]

    这个问题在这里已经有答案了 有谁知道有什么脚本 包可以自动将 sourceforge bug 功能请求跟踪器中的票证迁移到 GitHub 问题吗 可以将 sourceforge 票证导出为 XML 所以我想应该可以编写一个脚本来自动在 Gi
  • Git:设置仅获取远程?

    当我跑步时git remote v在我配置了远程的 Git 存储库之一中 我看到每个远程都具有获取和推送规范 git remote v
  • 连接两个 Git 存储库的历史记录?

    我有一个旧的 Git 存储库 请调用它app 然后 一年后 我想从头开始重建应用程序 所以我创建了一个新的存储库 称之为app 2 现在 我意识到我应该创建一个新分支或其他东西 而不是一个新的存储库 因为我想移动app 2在之上app然后摆
  • 撤消 git merge(尚未推送)

    我只是将一些更改提交到我的功能分支之一 feedback tab 然后签出 master 并将它们合并到那里 我实际上打算将它们合并到我的 开发 分支中 现在 master 领先于 origin master 其远程 17 个提交 我还没有
  • 如何修复 git 子模块错误 fatal: Needed a single revision Unable to find current origin/master revision in submodule path?

    我不断收到这个问题 fatal Needed a single revision Unable to find current origin master revision in submodule path coq serapy 我试过了
  • 无法在heroku上推送node.js应用程序

    我尝试在heroku 上推送我的node js 应用程序 但是 无法检测到此应用程序的默认语言 我什至尝试过heroku buildpacks set heroku nodejs 但还是无法推动 Counting objects 31 do
  • 使用 Git 和 Eclipse 管理 Android 项目

    我相信我有一个非常常见的问题 它会影响具有多个应用程序版本的开发人员 在我的例子中 我有两个 付费版本和免费版本 为了管理这两个版本 我使用具有 2 个不同分支的同一个 git 项目 免费和付费 然而 我的源代码包名称彼此不同 如预期 并且
  • 使用 git-cvsserver 和 CVS 工作副本获取 commitid 或“git描述”

    我有一些自动化工具可以通过以下方式访问 git 存储库cvs and git cvsserver 我希望这些工具能够看到他们签出的内容的提交 ID 这是否记录在CVS元数据目录 None
  • 将生成的文件存储在 Git 中

    我们有一个相当大且过于混乱的代码库 我们希望使用 Git 进行迁移 目前 它是一个大的整体块 不能轻易地分割成更小的独立组件 该代码构建了大量共享库 但它们的源代码如此交错 目前无法将其干净地分离到单独的存储库中 我不太关心 Git 是否可
  • 如何在命令行上创建要点

    我正在尝试从 bash 创建一个要点 并且我尝试了许多可以获得的版本脚本 但没有一个有效 这似乎是正确的 但它也不起作用 curl X POST d public true files test txt content String fil
  • Git 合并如何处理同时提交?

    给定一个具有两个分支的存储库 每个分支都有独立的提交 Branch Commits final e g i master a b c d f h 上图中的字母很重要 即 master 和 final 同时正在开发中 并且必须保留两个分支中的
  • git log over 使用 --follow 时限制输出? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 在以下服务
  • Git - 忽略对配置文件的特定修改

    我的项目中有一个配置文件 其中包含数据库的连接字符串以及多个应用程序设置 例如
  • 具有服务器端挂钩的托管 Git 解决方案?

    已经有一个类似的 版本控制托管解决方案 带有预提交挂钩 关于SO的问题 然而 提出这个问题的用户只需要客户端钩子 我正在寻找一个允许您配置的 Git 主机服务器端 hooks 我寻找这个的原因是为了防止开发人员能够在特定分支上 push f

随机推荐

  • 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的缩写 不过也没这么简单