[Git] 代码管理之 Git(六)Git rebase 压缩提交历史

2023-10-27

我们在工作中,可能会出现这样的情况,一项工作由好几个同事同时完成,然后每个人针对当前的feature都有对应的提交,那么就会造成同一个feature有多次提交的这样的冗余存在;除此之外,如果我们自己针对同一个feature的每天的提交以及一些细微的修改(代码格式或者一些typo),这样的commit是没有必要全部push到远程服务端的,那么这个时候我们就需要用git rebase 这个工具来“压缩”一下这些commit信息,换一句话说,就是把这些提交信息汇总成一条然后push给远程服务器。

同一分支rebase

我们在本地来做这么个实验,在工作区,我们发起三次commit。
git minor commits
现在我们发起第四次提交,然后我们发现,第四次提交与第三次和第二次都属于同一个feature(假设),然后我们想第二个,第三个,第四个commit汇总为一个commit,然后合同第一个commit一同push到服务器去。
forth commit

那么现在就是rebase上场的时候了。

git rebase -i [start] [end]

上式表示,从start的commit开始(不包含start的commit)到end结束,这之间的所有commit汇聚成一条commit

-i 参数表示 interactive,即与用户进行交互

那现在我们就可以使用

git rebase -i 1053ed 0ec702 

其中1053ed 是first commit的哈希值,0ec702是forth commit的哈希值。这条指令一执行,就会出现以下的画面(这里我机子上vim默认用VSCode打开)
rebase
上面的文档是一个vim界面的文档(与之前commit提交信息的相似),文档的上半部分代表这次rebase会提交的信息,会发现,这里每条信息都是由三部分组成

Command + Commit Hash + Commit comment

其中command代表命令,下面注释部分有多种命令的说明,默认的pick代表当前的当前commit会被出现在rebase后的提交信息中。我们这里希望仅仅只保留一条commit(即三合一),所以我们把forth commit和third commit的pick均改外squash,即合并到上一条commit中,改好保存,关闭编辑器,git 则会弹出下一个窗口
rebase commit editing
这个窗口就是commit信息窗口啦,现在second,third,forth三个commit已经合并成了一个commit,但是新的这个commit是需要commit信息的,所以这里就是写commit信息的地方(同样,此处的注释掉的部分是不会显示到最终的提交信息中的),这里我们仅把第一行的注释符号去掉,不修改其他任何信息,然后提交。然后提示rebase成功

Successfully rebased

然后我们再看 git log信息
在这里插入图片描述
之前的second commit, third commit,forth commit不见了,取而代之的是一个新的commit信息,而且新的commit hash值也发生了改变,说明这是一个完全全新的提交。

不同分支的rebase

假如我们现在有这么个情况发生。
before rebase
主线上有MAS commit 1和MAS commit 2两次提交,然后在MAS Commit 2的时候,我们拉出了一条dev分支用于开发一个功能,然后直到这个功能开发完成共计向本地仓库提交了三次,到了DEV commit 5处,当准备向master主线提交merge之前,主线master被更新了,先于dev分支,走到了MAS commit 6处(此时,DEV commit 5还是基于 MAS commit 2的修改)。

此时,我们想把DEV commit 5与主分支进行合并,我们可以有两种做法,一种是采用merge的方法,把当前分支与master分支直接进行merge,然后解决冲突后push到服务器,这时,会形成一个新的commit节点,如下图的MAS commit 7,而且在working tree上也是按照提交的时间先后顺序进行排列的。
在这里插入图片描述
上面的例子是用merge的方式做,另一种方法是用rebase来做,rebase的话,会把DEV commit 3,4,5 均基于MAS commit 6做修改而形成:
在这里插入图片描述
这里,主线和分支的提交均按照线性时间进行排列了,而且DEV分支已经基于最新的master提交进行了rebase,所以换句话说,rebase后的commit 3,4,5应该说已经不再是以前的commit 3,4,5了,而且它们的commit hash值已经发生了变化。

此时,再执行git merge 即可。

总结下,上述情况发生时的两种处理方式

  • 直接把分支和主线进行merge,解决冲突,生成一个全新的commit节点。但是保留了原分支,且原分支的hash值不变
  • 先rebase主分支,再merge,解决冲突,这样不会生成新的commit节点,但是虽保留了原分支,但原分支的每个提交节点的commit hash均发生了变化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Git] 代码管理之 Git(六)Git rebase 压缩提交历史 的相关文章

随机推荐

  • osgEarth的Rex引擎原理分析(一二六)rex瓦片组织方式

    目标 一二五 中问题212 通过如下确定瓦片的组织方式 核心是profile osgEarth Map cpp void Map calculateProfile collect the terrain layers we will nee
  • [1075]OpenSSL和Python实现RSA Key公钥加密私钥解密

    文章目录 1 OpenSSL实现非对称加解密 1 1 生成私钥 并导出公钥 1 2 准备测试数据 1 3 公钥加密 1 4 私钥解密 2 Python实现非对称加解密 3 非对称加解密的疑问 为什么RSA公钥每次加密得到的结果都不一样 1
  • Linux复制到home后自动删除,[rm] Linux 防止"rm -rf /" 误删除

    引以为戒 一 缘由 最近看到这则新闻 很是悲伤 因为我最近也在用ansible 然而这一错误源自Ansible上糟糕的代码设计 这款Linux实用工具被用于在多台不同服务器上自动执行脚本 开发者解释到 实际参数应该是 rm rf foo b
  • Tomcat部署静态页面

    安装Tomcat 1 将html文件放在ROOT文件下 2 将html文件直接放在webapp下
  • java并发包:读写锁

    本文转载至 http blog csdn net a910626 article details 51900954 ReadWriteLock是jdk5中提供的读写分离锁 读写分离锁可以有效的帮助减少锁竞争 以提升性能 用锁分离的机制来提升
  • 手机设置代理后无法上网_fiddler 手机代理设置过程及问题解决

    之前在学习用fiddler对手机进行抓包的时候 手机设置代理一直失败 电脑ip地址和端口号也是正确的 但就是发生一些奇奇怪怪的问题连接不上 但最后把所有过程重新试了一遍就莫名其妙的成功了 在这里设置代理的整个过程梳理一下 如果看到这篇文章的
  • Unity ILRuntime Debugger使用及常见问题

    目录 前言 1 安装 2 使用 3 常见问题 前言 ILRuntime支持在VS中断点调试 下面说一下ILRuntime Debugger的使用及常见问题 1 安装 需要下载对应版本的ILRuntime Debugger VS插件 我是在U
  • [Oracle][Postgresql][mysql]三个数据库产品下表字段存在空值或者为空创建索引是否生效测试

    postgresql 数据库测试开始 本次测试以pg 数据库 10 11版本 postgres select version version PostgreSQL 10 11 compiled by Visual C build 1800
  • BIO测试例子

    BIO一个测试例子 运行的环境window 运行的环境window bio的模式 当前有一个客户端在访问服务端时 并且阻塞在发送数据处 第二个客户端是无法访问的 import java io IOException import java
  • 用好lua+unity,让性能飞起来——lua与c#交互篇

    前言 在看了uwa之前发布的 Unity项目常见Lua解决方案性能比较 决定动手写一篇关于lua unity方案的性能优化文 整合lua是目前最强大的unity热更新方案 毕竟这是唯一可以支持ios热更新的办法 然而作为一个重度ulua用户
  • openwrt安装打印机服务器_原创

    作者 水滴实验室 单位 恒安嘉新 前言 随着物联网时代逐步的发展 设备之间的联系更为紧密 每个节点都无法独立存在 而与我们每个人都 息息相关的一些设备 路由器 摄像头 打印机等越来越多的影响着我们的生活各个方面 小到个人隐 私 大到敌对势力
  • 如何在Linux下配置网络访问外网

    Linux下的网络配置 1 查看自己的网卡编号 2 设置使用的网卡 IP地址 网关等参数 3 设置DNS服务器 4 重启网络服务 5 测试是否能ping通外网 6 无法Ping通的异常处理 7 Ping 外网的时候提示Temporary f
  • 鸿蒙3.0应用开发体验

    鸿蒙os3 0发布以来 华为官方开始主推ets arkui开发模式 逐渐抛弃java 为以后去安卓化做铺垫 但目前在笔者体验来看 仍需要大力完善 还有很长的路要走 什么是ets ts是js的超集 而ets是ts的超集 ets后缀的文件中可以
  • Django 迁移数据、迁移服务

    本文介绍两种常用的 Django 服务迁移数据方法 这两种方法都需要在新的服务器部署好数据库 创建好相应的数据库表和用户以后再进行 1 使用dumpdata命令 针对数据量不是很大的项目 可以使用此方法 操作起来比较简单 1 1 数据导出
  • 简单了解IPv4编址

    目录 一 IPv4地址 二 进制转换 三 有类IPv4 四 无类IPv4 4 1 子网掩码 4 2 地址规划 4 3 VLSM可变长子网掩码 五 私有IPv4地址 六 IPv4报文格式 七 IP地址解析 一 IPv4地址 IPv4地址由 网
  • Vue2项目中使用高德地图自定义(Marker)标记点和创建(MassMarks)海量标记点

    前言 本篇文章就是单独分享一下在Vue2项目中如何自定义创建marker标记点和针对要创建庞大数量标记点时所采用的API 能够快速创建数量庞大的marker 不至于在浏览器渲染时产生卡顿的现象 需要了解如何在Vue2项目中引入高德地图请参照
  • [c++/java]递归系列

    本系列是根据个人的做题总结出来 或许有不对之处 望给位大佬指出 同时这个系列也是长期的一个系列 每遇到一个优秀的递归题目 我都会添加上去 基本递归思路 递归之结束条件 个人认为在写递归之前应该首先考虑什么时候递归结束 或者是递归收敛于什么条
  • 有一台电脑怎么挣钱_游戏搬砖就能躺着挣钱?“我就一台电脑,要求不高月入过万就好”...

    随着网络游戏的日益普及 游戏搬砖 已经和代练 陪玩一样 成为很多玩家专职 兼职的工作 对于这样的一份职业 有人不屑 有人眼浅 更多人在看了有搬砖党换一套海景房的新闻 觉得这个职业就是个可以一夜暴富或者躺着挣钱的职业 因而也想自己下海尝试 事
  • 基于stm32作品设计:多功能氛围灯、手机APP无线控制ws2812,MCU无线升级程序

    文章目录 一 作品背景 二 功能设计与实现过程 三 实现基础功能 一 首先是要选材 二 原理图设计 二 第一版本PCB设计 三 焊接PCB板 四 编写单片机程序 五 下载程序验证 四 外壳设计 一 CAD图纸设计 二 磨砂亚克力板 五 重新
  • [Git] 代码管理之 Git(六)Git rebase 压缩提交历史

    我们在工作中 可能会出现这样的情况 一项工作由好几个同事同时完成 然后每个人针对当前的feature都有对应的提交 那么就会造成同一个feature有多次提交的这样的冗余存在 除此之外 如果我们自己针对同一个feature的每天的提交以及一