Git进阶系列 | 6. 交互式Rebase

news2024/10/7 16:26:04

Git是最流行的代码版本控制系统,这一系列文章介绍了一些Git的高阶使用方式,从而帮助我们可以更好的利用Git的能力。本系列一共8篇文章,这是第6篇。原文:Interactive Rebase: Clean up your Commit History[1]

交互式Rebase是Git命令中的瑞士军刀,有很多用例和可能性,对任何开发人员的工具链都是极好的补充,允许我们在与团队成员分享工作之前修改本地提交历史。

我们看看使用交互式rebase可以做些什么,然后看一些实际的例子。

Git进阶系列:

  1. 创建完美的提交
  2. Git中的分支策略
  3. 基于Pull Request实现更好的协作
  4. 合并冲突
  5. Rebase vs Merge
  6. 交互式Rebase(本文)
  7. Git中的Cherry-pick提交
  8. 用Reflog恢复丢失的提交

重写提交历史

简而言之,交互式rebase允许操作、优化和清理提交历史。你可以…

  • 修改提交信息
  • 合并多个提交
  • 拆分、编辑已有提交
  • 对提交重排序
  • 删除提交

请记住,交互式rebase会重写提交历史,所有涉及的提交都将获得新的哈希ID。另外,简单提醒一下: 提交id是用于识别提交的,是SHA-1校验和。因此,通过改变哈希,在技术上来说我们创建了全新的提交。这意味着不应该在已经推送到共享远端代码库的上使用交互式rebase。其他团队成员的工作可能就基于这些提交,当我们使用交互式rebase重写提交历史时,就改变了这些基础提交。

所有这些都意味着交互式的rebase是为了帮助我们在合并(并可能推入)到共享的团队分支之前清理和优化自己的本地提交历史。

交互式rebase工作流

在我们进行交互式rebase测试之前,先看看一般的工作流。无论做什么,删除提交、更改提交消息、合并提交……这些步骤都是相同的。

第一步是确定要操作的提交的范围,想回到多久以前?一旦有了答案,就可以开始交互式rebase会话了。在这里,我们有机会编辑提交历史,比方说可以通过重新排序、删除、组合提交等方式操作所选择的提交。

在第一步中,总是要通过查看提交历史记录了解当前状态,可以使用git log命令来检查项目的历史并显示提交日志。

下面是本文使用的示例代码库:

alt

检查完后,就可以开始工作了。我们一步一步来,在示例中,我们将做以下事情:

  • 首先,修改旧的提交信息。
  • 其次,合并两个旧的提交。
  • 然后,分解一个提交。
  • 最后,删除一个提交。

修改提交信息

许多情况下,我们希望更改最近的提交。请记住,这个场景中有一个不涉及交互式rebase的捷径:

$ git commit --amend

这个命令会打开默认的文本编辑器,可以修改最近提交的内容和信息。我们可以更改、保存并退出编辑器。该操作不仅可以更新提交信息,还会有效的更改提交本身并编写一个新的提交。

如果已经将上次提交的文件推送到远端代码库,同样请小心,不要修改它!

对于任何其他提交(任何比最近一次更早的提交),都必须执行交互式rebase。要交互式运行git rebase,需要添加-i选项。

第一步是确定基础提交: 要更改的提交的父提交。可以通过使用提交的哈希ID或执行少量计数来实现这一点。要更改最后三个提交(或者至少其中一个),可以这样定义父提交:

$ git rebase -i HEAD~3

该命令会打开一个编辑器窗口,可以看到所选择的三个提交(我说的“选择”是指提交的范围: 从HEAD一直到HEAD~3)。和git log不一样,这个编辑器将最老的提交(HEAD~3)显示在顶部,最新的在底部。

alt

在这个窗口中,实际上并不需要更改提交,只需告诉Git要执行哪种操作。Git为此提供了一系列关键字,在我们的示例中,将单词pick更改为reword,这允许我们更改提交信息。保存并关闭编辑器后,Git将显示并允许更改实际的提交信息。保存并再次退出,就这样!

合并提交

下一个示例,我们将两个提交(“7b2317cf Change the page structure”和“6bcf266 Optimize markup”)合并成一个提交。同样,第一步需要确定基础提交。我们至少需要回到父提交:

$ git rebase -i HEAD~3

编辑器窗口再次打开,但这次我们输入的不是reword,而是squash。确切地说,我们在第2行中将pick替换为squash,以便将其与第1行合并。记住这一点很重要: squash关键字会将标记的行与它上面的行合并起来!

alt

保存更改并关闭窗口后,将弹出一个新的编辑器窗口。为什么?因为通过合并两个提交,我们创建了一个新的提交!而这个新的提交需要一条提交信息。输入信息,保存并关闭窗口……这样就成功合并了两次提交。多么强大!

最后,给那些使用“Tower”Git桌面GUI的人一点“专业提示”: 为了执行squash,可以简单的在提交视图中互相拖放提交。如果想要更改提交信息,只需右键单击问题中的提交,并从上下文菜单中选择“Edit commit message”即可。

alt

删除提交

最后的例子将介绍一个大家伙: 从提交历史中删除一个修订!为此,我们使用drop关键字来标记想要删除的提交:

drop 0023cdd Add simple robots.txt
pick 2b504be Change headlines for about and imprint
pick 6bcf266 Optimizes markup structure in index page

这可能是一个很好的时机来回答一个你可能已经思考了一段时间的问题: 如果正在进行rebase操作,并认为“哦,不,这不是一个好主意”,你能做什么?没有问题,可以随时中止!只需输入以下命令,代码库就会回到rebase之前的状态:

$ git rebase --abort

改变历史

这些只是交互式rebase所能做的一些例子,还有很多其他方法可以控制和修改本地提交历史记录。

如果想更深入了解高级Git工具,可以免费查看“Advanced Git Kit[3]”: 这是关于分支策略、交互式Rebase、Reflog、子模块等主题的短视频集合。

References:
[1] Interactive Rebase: Clean up your Commit History: https://css-tricks.com/interactive-rebase-clean-up-your-commit-history/

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。
微信公众号:DeepNoMind

- END -

本文由 mdnice 多平台发布

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

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

相关文章

数据结构:二叉树经典例题(单选题)-->你真的掌握二叉树了吗?(第二弹)

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关二叉树的经典例题,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数…

百度开源,一款强大的压测工具,可模拟几十亿并发场景

优点 性能强大统计信息详细使用场景丰富性能 HTTP 每秒新建连接数HTTP 吞吐HTTP 并发连接数UDP TX PPS测试环境配置统计数据开始使用 设置大页编译 DPDK编译 dperf绑定网卡启动 dperf server从客户端发送请求运行测试开源地址 dperf 是一款基于 DPDK 的 100Gbps 网络性能和负载…

小白快速自建博客--halo博客

小白快速自建博客–halo博客 前言:如何快速地搭建属于个人的博客,以下就推荐一个可以个性化的定制属于个人的专属博客–halo博客。 Docker安装 关于docker安装,可以查看文章:Linux下安装docker Docker相关指令 docker相关指令…

网络套接字基本概念

文章目录 1. 认识IP地址2. 认识端口号2.1 理解 "端口号" 和 "进程ID"2.2 理解源端口号和目的端口号 3. 认识TCP协议和UDP协议4. 网络字节序5. sockaddr结构 1. 认识IP地址 IP协议有两个版本,IPv4和IPv6。没有特殊说明的,默认都是指…

第五章 作业(149A)【计算机系统结构】

第五章 作业【计算机系统结构】 前言推荐第五章 作业148 补充910 最后 前言 2023-6-24 10:43:46 以下内容源自《【计算机系统结构】》 仅供学习交流使用 推荐 第三章 作业(7BF)【计算机系统结构】 答案参考: https://www.docin.com/p-8…

HTML 教程:学习如何构建网页||HTML 简介

HTML 简介 HTML 简介 现在您可以通过如下的一个 HTML 实例来建立一个简单的 HTML 页面&#xff0c;以此来简单了解一下 HTML 的结构。 HTML 实例 <!DOCTYPE html> <html> <head> <title>页面标题(w3cschool.cn)</title> </head> <…

中国电子学会2023年05月份青少年软件编程C++等级考试试卷四级真题(含答案)

1.怪盗基德的滑翔翼 怪盗基德是一个充满传奇色彩的怪盗&#xff0c;专门以珠宝为目标的超级盗窃犯。而他最为突出的地方&#xff0c;就是他每次都能逃脱中村警部的重重围堵&#xff0c;而这也很大程度上是多亏了他随身携带的便于操作的滑翔翼。 有一天&#xff0c;怪盗基德像…

混频器【Multisim】【高频电子线路】

目录 一、实验目的与要求 二、实验仪器 三、实验内容与测试结果 1、测试输入输出波形&#xff0c;说明两者之间的关系 2、测试输出信号的频谱(傅里叶分析法) 3、将其中一个二极管反接&#xff0c;测试输出波形&#xff0c;并解释原因&#xff1b;将两个二极管全部反接&am…

PID相关参数讲解:1、比例系数Kp与静态误差

PID的结构与公式 来研究静态误差的同学&#xff0c;应该是对PID的原理有一定理解了&#xff0c;简单的概念也不用过多重复。 比例控制时PID控制中最简单的一个&#xff0c;很多能用代码编写PID代码的同学&#xff0c;也不一定理解这个比例系数Kp的意义&#xff0c;以及比例控制…

C++进阶—多态

目录 0. 前言 1. 多态的概念 1.1 概念 2. 多态的定义及实现 2.1多态的构成条件 2.2 虚函数 2.3虚函数的重写 2.4 C11 override 和 final 3. 抽象类 3.1 概念 3.2 接口继承和实现继承 4.多态的原理 4.1虚函数表 4.2 变态选择题分析多态调用 4.3 多态的原理 4.4 动…

透过小说中的境界划分,看看你的能力处于哪个水平

文章目录 1. 写在前面2. 散修3. 练气期4. 筑基期5. 结丹期6. 元婴期7. 化神期8. 练虚期 1. 写在前面 当我们某天开始走出校园&#xff0c;踏入社会的时候&#xff0c;是否也会感到一丝恐惧与焦虑&#xff1f;当我们各自奔走加入到江湖大大小小的门派中&#xff0c;为了企业与老…

EL标签-给JSP减负

https://blog.csdn.net/weixin_42259823/article/details/85945149 安装使用 1. 通过命令行创建maven项目 2. 安装jstl包 <dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version> </depen…

仙境传说RO:服务器外网架设登陆教程

仙境传说RO&#xff1a;服务器外网架设登陆教程 大家好我是艾西&#xff0c;今天跟大家说一下自己编译的仙境传说RO服务端怎么开启外网让小伙伴和你一起玩。 目前开放的现成端有以下版本&#xff1a; 仙境传说ro守护永恒的爱 仙境传说ro爱如初见 仙境传说ro黑色派对 仙境…

docker-compose把微服务部署到centos7

前言 这里主要记录以下微服务使用docker、docker-compose部署遇到的一些问题&#xff0c;大佬可以绕道去看看自动化集成这篇文章 部署之前你需要准备一些内容 微服务 这里feign-api是用来做服务之间相互调用的&#xff0c;单独抽离成了一个模块&#xff0c;gateway是服务网关&…

中国电子学会2023年05月份青少年软件编程C++等级考试试卷三级真题(含答案)

1.找和为K的两个元素 在一个长度为n(n < 1000)的整数序列中&#xff0c;判断是否存在某两个元素之和为k。 【输入】 第一行输入序列的长度n和k&#xff0c;用空格分开。 第二行输入序列中的n个整数&#xff0c;用空格分开。 【输出】 如果存在某两个元素的和为k&#xff0c…

CentOs中文件权限命令

文件权限&#xff1a; ls -l命令查看文件详情&#xff0c;前十位就是文件的类型和权限 第一位&#xff1a;类型&#xff1a; - 普通文件 d 目录 l 链接文件&#xff08;快捷方式&#xff09;link 2~4位&#xff1a;所有者的权限 5~7位&#xff1a;所有者所在组其它用户的权限 …

AI绘图-StableDiffusion安装

AI绘图-StableDiffusion安装 安装Python 1、去官网 https://www.python.org/downloads/ 下载Python3.10.10版本&#xff0c;网上建议下载3.10.6版本。 2、安装Python,打开安装界面&#xff0c;注意把Add Python to PATH选项勾上&#xff0c;然后选择自定义安装 3、点击WinR…

【数据结构与算法】2、链表(简单模拟 Java 中的 LinkedList 集合,反转链表面试题)

目录 一、链表基本概念和基本代码实现二、链表、动态数组整合&#xff08;面向接口编程&#xff09;三、clear()四、add(int index, E element)(1) 找到 index 位置的节点(2) get(int index) 和 set(int index, E element)(3) add(int index, E element) 五、remove(int index)…

基于Java+Swing+Socket实现中国象棋-网络版

基于JavaSwingSocket实现中国象棋-网络版 一、系统介绍二、功能展示1.系统登陆2.选择黑色方进行对局3.整体页面4、保存棋谱5、认输 三、其他系统四、获取源码 前言 中国象棋是起源于中国的一种棋&#xff0c;属于二人对抗性游戏的一种&#xff0c;在中国有着悠久的历史。由于用…

员工管理业务开发 -- 手把手教你做ssm+springboot入门后端项目黑马程序员瑞吉外卖(三)

文章目录 前言六、员工管理业务开发1.开发功能预览2.新增员工功能1&#xff09;需求分析2&#xff09;数据模型&#xff08;表&#xff09;3&#xff09;代码开发4&#xff09;功能测试5&#xff09;编写全局异常处理器 3.员工信息分页查询1&#xff09;需求分析2&#xff09;代…