【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.mzph.cn/news/710664.shtml

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

相关文章

编写科技项目验收测试报告需要注意什么?第三方验收测试多少钱?

科技项目验收测试是一个非常重要的环节,它对于确保科技项目的质量和可用性起着至关重要的作用。在项目完成后,进行科技项目验收测试可以评估项目的功能、性能和可靠性等方面,并生成科技项目验收测试报告,以提供给项目的相关方参考…

Docker技术概论(2):Docker环境的搭建

Docker技术概论(2) Docker环境的搭建 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blo…

自动采集API壁纸系统源码自适应手机端

HTML5响应式自动采集API壁纸系统源码自适应手机端 瀑布流加载 源码下载:https://www.qqmu.com/2303.html

yolov8涨点技巧,添加SwinTransformer注意力机制,提升目标检测效果

目录 摘要 SwinTransformer原理 代码实现 YOLOv8详细添加步骤 ymal文件内容 one_swinTrans three_swinTrans 启动命令 完整代码分享 摘要 Swin Transformer通过引入创新的分层注意力机制展现了其架构的独特性,该机制通过将注意力区域划分为块并在这些块内执…

进阶了解C++(4)——多态

在上篇文章中,简单的介绍了多态中的概念以及其相关原理。本文将针对多态中其他的概念进一步进行介绍,并且更加深入的介绍关于多态的相关原理。 目录 1. 抽象类: 2. 再谈虚表: 3. 多继承中的虚函数表: 1. 抽象类&am…

MySQL 用户账号迁移

文章目录 前言1. 工具安装1.1 下载安装包1.2 编译安装 2. 用户迁移后记 前言 有一个典型的使用场景,就是 RDS 下云大多数都是通过 DTS 进行数据传输的,用户是不会同步到自建数据库的。需要运维人员在自建数据库重新创建用户,如果用户数量很多…

基于springboot+vue的在线考试与学习交流平台

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

中小型水库安全监测运营解决方案,筑牢水库安全防线

我国水库大坝具有“六多”的特点。第一,总量多。我国现有水库9.8万座,是世界上水库大坝最多的国家。第二,小水库多。我国现有水库中95%的水库是小型水库。第三,病险水库多。 目前,在我国水库管理中,部分地方…

供应链|NUS覃含章MS论文解读:数据驱动下联合定价和库存控制的近似方法 (二)

编者按 本次解读的文章发表于 Management Science,原文信息:Hanzhang Qin, David Simchi-Levi, Li Wang (2022) Data-Driven Approximation Schemes for Joint Pricing and Inventory Control Models. https://doi.org/10.1287/mnsc.2021.4212 文章在数…

深度神经网络联结主义的本质

一、介绍 在新兴的人工智能 (AI) 领域,深度神经网络 (DNN) 是一项里程碑式的成就,突破了机器学习、模式识别和认知模拟的界限。这一技术奇迹的核心是一个与认知科学本身一样古老的思想:联结主义。本文深入探讨了联结主义的基本原理&#xff0…

实例:NX二次开发抽取平面以及标准柱面中心线

一、概述 最近体验许多外挂,包括胡波外挂、星空外挂及模圣等都有抽取面的中心线,由于刚刚学习,我尝试看看能不能做出来,本博客代码没有封装函数,代码有待改进,但基本可以实现相应的功能。 二、案例实现的功…

【web APIs】3、(学习笔记)有案例!

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、概念其他事件页面加载事件元素滚动事件页面尺寸事件 元素尺寸与位置 二、案例举例电梯导航 前言 掌握阻止事件冒泡的方法理解事件委托的实现原理 一、概念…

SpringCloud Alibaba(保姆级入门及操作)

第一章 微服务概念 1.0 科普一些术语 科普一下项目开发过程中常出现的术语,方便后续内容的理解。 **服务器:**分软件与硬件,软件:类型tomcat这种跑项目的程序, 硬件:用来部署项目的电脑(一般性能比个人电脑好) **服务:**操作系统上术语:一个程序,开发中术语:一个…

数学建模【分类模型】

一、分类模型简介 本篇将介绍分类模型。对于二分类模型,我们将介绍逻辑回归(logistic regression)和Fisher线性判别分析两种分类算法;对于多分类模型,我们将简单介绍SPSS中的多分类线性判别分析和多分类逻辑回归。 分…

Java面试题之并发

并发 1.并发编程的优缺点?2.并发编程三要素?3.什么叫指令重排?4.如何避免指令重排?5.并发?并行?串行?6.线程和进程的概念和区别?7.什么是上下文切换?8.守护线程和用户线程…

<网络安全>《60 概念讲解<第七课 网络模型OSI对应协议>》

1 OSI模型 OSI模型(Open Systems Interconnection Model)是一个由国际标准化组织(ISO)提出的概念模型,用于描述和标准化电信或计算系统的通信功能,以实现不同通信系统之间的互操作性。该模型将通信系统划分…

【k8s管理--Helm包管理器】

1、Helm的概念 Kubernetes包管器 Helm是查找、分享和使用软件构件Kubernetes的最优方式。 Helm管理名为chart的Kubernetes包的工具。Helm可以做以下的事情: 从头开始创建新的chat将chart打包成归档tgz)文件与存储chat的仓库进行交互在现有的Kubernetes集群中安装和…

【Android】View 的滑动

View 的滑动是 Android 实现自定义控件的基础,同时在开发中我们也难免会遇到 View 的滑动处理。其实不管是哪种滑动方式,其基本思想都是类似的:当点击事件传到 View 时,系统记下触摸点的坐标,手指移动时系统记下移动后…

【AI+应用】怎么快速制作一个类chatGPT套壳网站

最近有人问我, 看了我之前写的一篇文章 [人工智能] AI浪潮下Sora对于普通人的机会 , 怎么做一个类chatGPT的套壳网站,是从0开始做么。 对于普通人来说,万事不懂先AI, AI找不到答案搜索google或百度。对于程序员来说…

C# 获取类型 Type.GetType()

背景 C#是强类型语言,任何对象都有Type,有时候需要使用Type来进行反射、序列化、筛选等,获取Type有Type.GetType, typeof(),object.GetType() 等方法,本文重点介绍Type.GetType()。 系统类型/本程序集内的类型 对于系…