【Git教程】(七)变基与拣取 —— 变基操作的概念、适用场景及其实现方式,拣取操作的实现 ~

Git教程 · 变基与拣取

  • 1️⃣ 工作原理:复制提交
  • 2️⃣ 避免“钻石链”
  • 3️⃣ 什么情况下会遇到冲突
  • 4️⃣ 移植分支
  • 5️⃣ 执行变基后原提交的情况
  • 6️⃣ 提交的原件与副本存在于同一版本库中所带来的问题
  • 7️⃣ 捡取
  • 🌾 总结

在这里插入图片描述

通常, 一段提交历史中往往都存在着许多杂乱的分支。Git 可以尽可能地帮助我们理顺这些历史记录。这里会用到的最重要的工具当然就是 rebase 命令了,它可以可以将某一次提交在提交图上产生的影响从一个节点转移到另一节点。

我们可以用该命令做以下几件事情。

  • 如果你不小心在错误的分支上执行了一次提交。例如你可能将一次 bug 修复提交到了 当前开发线(即 master 分支)上。
  • 当多个开发者在致力于开发同一软件时,他们会频繁地整合自己的修改。如果不进行 变基,他们可能会创建出一部带有多个小分支和分岔的历史(我们称之为钻石链)。 通过 rebase 命令,我们可以将其改造成一部较为平滑的线性历史。

1️⃣ 工作原理:复制提交

变基操作的工作原理很简单: Git 会让我们想要移动的提交序列在目标分支上按照相同的顺序重新再现一遍。这就相当于我们为各个原提交做了个副本,它们拥有相同的修改集、同一作者、日期以及注释信息。

请注意:乍看之下,好像 Git 只是在执行变基重操作时移动了相关提交。但事实上,这 些“被转移”的提交往往都是一些拥有不同提交散列值的新提交。了解这一情况非常重要,
尤其是在提交已经从原分支已经扩散到其子分支时。

由于新提交会被记录在提交图中的不同位置,所以当然有可能会引发冲突,因为其原本的修改未必适合当前的情况。对于这类修改,我们必须要通过手动来解决合并冲突。


2️⃣ 避免“钻石链”


在这里插入图片描述

如果为同一软件工作的若干个开发者频繁地归并各种修改,该项目所建立起来的提交历史看起来就会像一条钻石链。这时候我们可以利用变基操作将其整理成一部内容等效,但线性发展的历史。

下面,我们通过下图中的具体例子来看看变基操作的具体过程。如你所见,从 master 分支上岔出了一个名为 feature-a 的分支,其中包含了C 和 D 两个提交。同时, master 分支也得到了进一步的开发,于是多出了一个提交B。

在这里插入图片描述现在,你可以通过 git merge master 命令来合并这些修改,然后再用 rebase 命令理顺其
历史纪录。该命令需要一个参数,以说明我们要将活动分支上的最新修改纳入哪一个分支。

> #Branch "feature-a" is active
> git rebase master

在收到这个命令之后,Git就会去做以下事情,以便将活动分支(feature-a)融合到 master
分支上。

  • 确认涉及到哪些提交:Git会确认是要将活动分支 feature-a 上的哪一些目前不在目标分支 ( master) 上,在这里就是提交C 和 D。
  • 确认目标位置:Git 会确认目标提交的位置,该提交就是 master 上 feature-a 将要执行变基操作地方,在这里就是提交B。
  • 复制提交:以目标提交为基础重演上述提交中的所有修改,并相应创建提交 C’ 和 D’。
  • 将活动分支重置:活动分支将被移动到上述被复制提交的顶部,在这里就是提交D’。

然而在很多情况下,我们可能不会直接去调用 rebase 命令。相反,我们通常会用 pull 命令加上 --rebase 选项来对远程版本库中的修改进行变基处理。

注意:旧提交 C 和 D 偶尔还会留在版本库中,虽然它们已经不再直接可见,因为 feature-a 分支现在已经指向了 D’ 。但是,我们依然还是可以通过散列值对C 和 D 进行访问。 只有在用 gc 命令执行垃圾回收之后,它们才会真正从版本库中消失。


3️⃣ 什么情况下会遇到冲突

merge 命令一样,rebase 命令也会在相关修改不匹配的时候以冲突的形式被终止。 但它们之间有个重要的区别:即在合并过程中,我们得到的是两个分支合体之后的单一提交结果。而在变基过程中,我们是在依次执行重复的若干次提交。如果一切顺利,其最后一次所提交的内容应该会与其执行 merge 命令时的结果相同,因为 Git 在这两个命令中采用 了相同的冲突解决算法。但如果 rebase 命令在执行过程中遇到冲突情况,该命令进程就会被打断,相关文件中也会出现冲突标志。我们需要先手动或通过合并工具对文件进行清理, 并重新将它们添加到暂存区中。然后再执行 rebase 命令加 --continue 选项,从该点继续之前的进程。

> git add foo.txt
> git add bar.txt
> git rebase --continue

当然,我们也可以用 --abort 选项取消这次的 rebase 命令,或者用 --skip 选项跳过引起冲突的提交。这样该次提交就被直接忽略,其中的修改将不会出现在新分支上。

需要特别注意,与合并操作不同的是,在被中断变基作业的那些提交副本中可能已经有一部分被执行变基操作了。


4️⃣ 移植分支

有时候,在已经创建了一个分支,并完成其首次提交的情况下,我们也可以通过 --onto
选项将该分支移植到提交图中的另一个位置上。
在下面的例子中, feature-a 分支被移植到了release1 分支上。

在这里插入图片描述

> #Branch "feature-a" is active
> git rebase master --onto release1

在这里, rebase 命令的第一个参数所指定的是原分支(即这里的 master 分支)。然后,
Git 就会去确认活动分支(即 feature-a) 上所有不属于原分支的所有提交(在这里就是提交E 和 F) 。 然后通过--onto 选项将这些提交拷贝到指定位置上(即这里的 release1 分支)。

某一分支已经被移动到了提交图中的另一位置上。

  1. 在必要情况下,我们可以切换到待移动的分支上
    git checkout the-branch
  2. 确定原位置
    即原分支,相关分支是从这里被移出去的。Git会将其中所有不属于原分支的提交移出来。
  3. 检查所要移动的内容
    提前对可能会受到影响的提交做个相应的检查是一个明智的选择,因为一个变基操作错误可能会给版本库带来一个非常混乱的局面。
    git log origin..the-branch
  4. 确定目标位置
    选择一个分支来充当被移动分支执行变基操作的目标位置。
  5. 执行变基操作
    git rebase origin --onto target

注意: rebase 命令中的原位置并不一定非得是一个分支。它也可以是任何提交。


5️⃣ 执行变基后原提交的情况

这些提交会在变基过程中被复制。但其原件(即本例中的提交C 和 D) 依然还可以通过散列值来进行访问,如图所示。通常情况下,当没有分支可以进一步从这些提交中继续发展时,下一轮垃圾收集过程(通过 gc 命令)就会直接将它们从版本库中删除。

在这里插入图片描述


6️⃣ 提交的原件与副本存在于同一版本库中所带来的问题

重复容易造成版本库中的混乱。它们可以很容易引起误解,让人以为某段既定的代码修 改包含在哪一分支上,不包含在哪一分支上。通常来说,git log HEAD..a-branch 显示的是在a-branch 上而不在当前分支的那些提交。如果存在重复的话,当前分支也可能已经包含了该代码的修改。这会增加审查以及质量保证方面的复杂性。

除此之外,这种重复还有可能会给我们稍后对带有重复提交的分支与带有原始提交的分 支之间的合并带来麻烦。在最好的情况下,Git会自己识别出同样的修改出现了不止一次,并对其只采用一次。而在最坏的情况下,如果该重复提交被当作冲突来处理, Git 是无法检测到的,然后它会试图多次采用这一修改。结果就会产生一些令用户意外的冲突。

一旦我们将某次提交传递给了一个远程版本库,就不应该再用 rebase 命令来移动该提交了。否则,由于其他开发者可能会在其原作上继续他们的工作,这在将来再次合并修改的时候一定会带来问题。


7️⃣ 捡取

接下来,我们再来介绍另一种复制提交的方式: cherry-pick 命令。我们可以用它来指定自己需要的提交,Git 会为此创建一次新的提交,该提交中会拥有相同的修改集与当前分支中的元数据。

> git cherry-pick 23ec70f6b0

那么对于捡取操作,我们应该了解哪些事情呢?

  • cherry-pick 不会参考历史纪录。因而 mergerebase 还可以被正确地识别成文件的 重命名与移动操作, cherry-pick 则不能。
  • 捡取操作有时候会被用来将一些小bug 的修复传递到各种不同的发行版中。
  • 该操作的另一种应用是从即将删除的分支中转移出有用的提交。
  • 警告:捡取操作也有可能会引发我们之前所说的重复提交问题。

🌾 总结

  • 变基操作:Git 能将提交复制到提交图中的其他地方。尽管其中的修改与元数据(作者、日期)将保持不变,但该复制结果会有一个新的提交散列值。你可以通过rebase 命令以多种方式对提交图进行重构。
  • 只适用于推送之前:通常情况下,我们应该只对那些还未被传递给其他版本库的提交试用rebase 命令。否则,这样做可能给日后带来非常麻烦的合并冲突。
  • 理顺历史:如果我们在并行式开发的过程中使用merge 命令解决了其中的冲突,就会得到一部经历了多次分岔与合并的历史。如果用rebase 来代替 merge, 我们就会得到一部呈线性发展的历史。
  • 变基过程中的冲突:Git 会逐段逐段重演被复制的提交。如果因为某些修改与工作区内容不相符而引发了冲突,变基的进程就会被中断。与执行 merge 命令的过程一样, 开发者可以先手动解决掉冲突,再继续变基的过程。
  • rebase --onto :通过该选项,我们可以将某一分支移动到提交图中另一个完全不同的位置。


温习回顾上一篇(点击跳转)
《【Git教程】(六)分支合并 —— 合并过程,各类合并冲突及解决思路 ~》

继续阅读下一篇(点击跳转)
《》

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HUAWEI 华为交换机 配置基于VLAN的MAC地址学习限制接入用户数量 配置示例

组网需求 如 图 2-15 所示,用户网络 1 通过 LSW1 与 Switch 相连, Switch 的接口为 GE0/0/1 。用户网络2通过 LSW2 与 Switch 相连, Switch 的接口为 GE0/0/2 。 GE0/0/1 、 GE0/0/2 同属于 VLAN2。为控制接入用户数,对 VLAN2 进…

77. 组合(力扣LeetCode)

文章目录 77. 组合题目描述回溯算法组合问题的剪枝操作 77. 组合 题目描述 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n 4, k 2 输出: [ [2,4], [3,4],…

【重要公告】BSV区块链协会宣布将启动多项动态安全增强措施

​​发表时间:2024年2月16日 2024年2月16日,瑞士楚格 - BSV区块链协议的管理机构BSV区块链协会(以下简称“BSV协会”)宣布对其运营模式实施全新的安全架构,其中包括引入网络访问规则和数字资产找回协议,以及…

Matlab: Introduction to Hybrid Beamforming

文章目录 来源混合波束赋形的基本概念System Setup关键函数 来源 在matlab的命令行输入 doc hybrid beamforming 混合波束赋形的基本概念 混合波束形成简介 本例介绍了混合波束形成的基本概念,并说明了如何模拟这种系统。 现代无线通信系统使用空间复用来提高散…

ARM64汇编02 - 寄存器与指令基本格式

最近的文章可能会有较多修改,请关注博客哦 异常级别 ARMv8处理器支持4种异常等级(Exception Level,EL)。 EL0 为非特权模式,用于运行应用程序,其他资源访问受限,权限不够。 EL1 为特权模式&…

C++:常量表达式

C11开始constexpr作为一种声明,为编译器提供了在编译期间确认结果的优化建议,满足部分编译期特性的需求 constexpr和const区别 int b10; const int ab; //运行成功 constexpr int cb; //编译器报错,b的值在编译期间不能确定 const int size1…

电视盒子什么牌子好?老烧分享电视盒子品牌排行榜

多年前开始我就用电视盒子了至今已经七年,对各个品牌的电视盒子我都有详细深入的了解,看到网友们在讨论电视盒子什么牌子好,不知道如何挑选电视盒子的朋友们可以关注发烧友圈公认的电视盒子品牌排行榜,看看入围的都有哪些品牌吧。…

数据库之MVCC

1、什么是MVCC MVCC(Multi-Version Concurrency Control)即多版本并发控制。MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。MVCC使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行…

如何让电脑待机而wifi不关的操作方法!!

1、一台电脑如果一天不关机,大约消耗0.3度电。 一般一台电脑的功耗约为250-400W(台式机)。 一台电脑每月的耗电量:如果是每小时300W每天10小时每月30天90KW,即90千瓦时的电。 这只是保守估计。 2、使用完毕后正常关闭…

小兴教你做平衡小车-stm32程序开发(串口打印)

文章目录 1 前言2 串口打印库函数版本3 串口打印寄存器版本3.1 配置时钟3.2 配置GPIO功能3.3 配置CR2寄存器3.4 配置CR1寄存器3.5 配置CR3寄存器 1 前言 我们在调试的过程中,都比较喜欢直观的数据,这时候我们可以使用芯片的串口功能,把数据打…

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量…

智慧生活,从餐厅开始:开发智能扫码点餐系统的技术详解

本篇文章,小编将深入为大家讲解开发智能扫码点餐系统的技术细节,从系统架构到关键功能实现,为读者提供全面的技术指南。 一、智能扫码点餐系统概述 可实现在线浏览菜单、点餐、支付等操作,大大简化了点餐流程,提升了…

Spring Cloud Gateway官方文档学习

文章目录 推荐写在前面一、熟悉Gateway基本概念与原理1、三大概念2、工作流程 二、基本使用路由断言的两种写法 三、路由断言工厂1、After路由断言工厂2、Before路由断言工厂3、Between路由断言工厂4、Cookie路由断言工厂5、Header路由断言工厂6、Host路由断言工厂7、Method路由…

大话设计模式——4.装饰模式(Decorator Pattern)

1.定义 1)可以在不改动原有对象代码的情况下扩展对象的功能,通过聚合的方式相较于继承更加灵活。 2)UML图 2.示例 汽车有很多装饰可选,如座椅、音响、轮胎等都可以进行自定义组装 1)抽象汽车对象 public interfac…

代码库管理工具Git介绍

阅读本文同时请参阅-----免费的Git图形界面工具sourceTree介绍 Git是一个分布式版本控制系统,它可以帮助开发者跟踪和管理代码历史。Git的命令行工具是使用Git的核心方式,虽然它可能看起来有些复杂,但是一旦掌握了基本命令,你…

回归预测 | Matlab实现SSA-BiLSTM-Attention麻雀算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测

回归预测 | Matlab实现SSA-BiLSTM-Attention麻雀算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测 目录 回归预测 | Matlab实现SSA-BiLSTM-Attention麻雀算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基…

Pytorch添加自定义算子之(5)-配置GPU形式的简单add自定义算子

参考:https://zhuanlan.zhihu.com/p/358778742 一、头文件 命名为:add2.h void launch_add2(float *c,const float *a,const float *b,int n);

【Unity】构建简单实用的年份选择器(简单原理示范)

在许多应用程序和游戏中,年份选择是一个常见的需求。无论是在日历应用程序中查看事件,还是在历史类游戏中选择时间段,年份选择器都是用户体验的重要组成部分,下面实现一个简易的年份选择器。 一、效果预览: 目录 一、…

为什么会出现 targetId 与 senderUserId 相同的情况?

描述 单聊会话(两位用户聊天)中出现了消息的 targetId 和 senderUserId 相同的情况。 分析 融云 IM 设计如此。 senderUserId 是消息的发送者的用户 ID。targetId 是当前会话的 ID,该 ID 指向与本端用户对话的用户 ID、群组 ID、聊天室 I…

蓝桥杯_定时器的基本原理与应用

一 什么是定时器 定时器/计数器是一种能够对内部时钟信号或外部输入信号进行计数,当计数值达到设定要求时,向cpu提出中断处理请求,从而实现,定时或者计数功能的外设。 二 51单片机的定时/计数器 单片机外部晶振12MHZ,…