【Git教程】(五)分支 —— 并行式开发,分支相关操作(创建、切换、删除)~

Git教程 · 分支

  • 1️⃣ 并行式开发
  • 2️⃣ 修复旧版本中的 bug
  • 3️⃣ 分支
  • 4️⃣ 当前活跃分支
  • 5️⃣ 重置分支指针
  • 6️⃣ 删除分支
  • 7️⃣ 清理提交对象
  • 🌾 总结

对于版本提交为什么不能依次进行,以便形成一条直线型的提交历史记录,我们认为有 以下两个重要原因。

  • 有两个以上的开发者在对同一个项目进行并行式开发。
  • 为修复旧版本中的 bug 而必须要创建和发布新的版本。

如果遇到以上两种情况,我们的提交历史图中就会出现分叉的情况。

在这里插入图片描述


1️⃣ 并行式开发

当有多个开发者用 Git 处理同一个软件开发项目时,他们就会在版本库的提交图中创建 各自的分支。下面我们来看下图, 其上半部分所显示的是两个独立的开发者在各自的本 地版本库中,基于提交B 成功创建了各自的版本(即提交C 和 D) 。 而在图的下半部分, 你将看到的是它们合并之后的版本库(关于合并的相关细节请参见后续文章)。正如你所见,它创建了一个分支,这种类型的分叉在并行式开发中是难以避免的。

在这里插入图片描述


2️⃣ 修复旧版本中的 bug

正如我们之前所说,分支可能会因并行式开发的需要 而创建。但除此之外,它也有可能会因修复软件旧版本中 的 bug 而创建。下面我们来看一个例子(见下图):假设 当开发者们正在为即将发布的版本(提交 C 和 D) 加班加点时,我们在该软件的当前版本(提交B) 中检测到了一个错误。由于眼下带有新功能的提交 C 和 D 都还没有 准备好交付,用于错误修复的提交 E 只能基于提交 B 来创建。

在这里插入图片描述


3️⃣ 分支

下面再来看看下图,在这个例子中,我们一方面在 release1 这一当前发行版上继续当前 开发分支 master 上的工作。随着各轮新的提交,该分支始终处于活跃向前的状态。而另一方面,我们会看到 release1 分支从右边岔开了,它对自身的bug 进行了修复。

在这里插入图片描述

分支可以看作是开发过程当中的并行线,我们可以把该提交图想象成游泳池中的泳道(见 下图)。

在这里插入图片描述

注意:Git并不知道某次提交是否被分配给了某个分支,划分泳道在这里某些程度上来 说算是一种比喻性的说法。

4️⃣ 当前活跃分支

在一个 Git 版本库中,总是唯一存在着一个活动分支。我们可以用 branch 命令(不带选
项)来列出当前所有的分支。其中用星号 (*) 凸显的就是当前的当前活跃分支。

> git brancha-branch
* masterstill-a-branch

一般情况下,活动分支将会被继续用于接受所有新的提交,并将分支指针移动至最近的
那次提交。当然,我们也可以用checkout 命令来改变当前的活跃分支。

> git checkout a-branch

下面,我们来创建一个新的分支。
1a. 为当前提交创建分支

git branch a-branch

1b. 为任意一批提交创建分支
我们也可以为任意一批提交创建新的分支。为此,我们必须要指定该分支上的第一次提交。

git branch still-a-branch 38b7da45e

1c. 从现有分支中创建分支

git branch still-a-branch older-branch

2.切换到新分支
branch 命令只能用于创建新的分支,但并不会自动切换到该新分支上。如果我们想要
切换到新的分支上,就得使用 checkout 命令。

git checkout a-branch

快捷方式:创建并切换到新分支

git checkout -b a-branch

通常情况下,我们可以用 checkout 命令在分支之间来回切换。但是,如果这时候工作 区还存在着一些修改,我们就必须要先决定好如何处理这部分修改。

  1. 进行 Checkout
    下面这个checkout 很可能会被拒绝。

    > git checkout a-brancherror:Your local changes to the following files would be overwritten by checkout:foo.txtPlease,commit your changes or stash them before you can switch branches.Aborting
    

    如你所见,工作区或暂存区存在着一些修改,它们还没有被确认为一次提交。所以我们必须先决定以下何种方式来处理这些修改。

  2. 提交修改并切换

    > git commit --all
    > git checkout a-branch
    
  3. 放弃这部分修改并进行切换
    我们可以用 --force 选项来进行强制切换,但这样做会令这部分修改被覆盖!

    > git checkout --force a-branch
    
  4. 储藏修改并切换
    我们可以用stash 命令先将这部分修改储藏起来,然后再进行切换。 之后再用 stash pop 命令来恢复它们。

    > git stash
    > git checkout a-branch
    

5️⃣ 重置分支指针

分支指针主要用于指向活动分支,它会每次提交时移动到最新提交上。因此在通常情况 下,我们几乎不太需要去直接设置分支指针。但偶尔我们也会因一些偶发事件而失去对该指针的跟踪,想将其恢复到之前的状态。在这种情况下,我们可以用 reset 命令来重置分支指针。

> git reset --hard 39ea2la

这样一来,该指针就被重置到了提交39ea21a 所在的活动分支上。其中的 --hard 选项用于确保工作区和暂存区也都会被设置都提交39ea21a 的状态。

需要提醒的是,reset --hard 命令会覆盖当前工作区和暂存区中的所有修改。所以最好在 执行重置之前先用 git stash 命令存储一下这些修改。


6️⃣ 删除分支

我们可以通过branch -d 命令来删除分支。

  1. 删除一个已被终止的分支

    > git branch -d b-branch
    
  2. 删除一个打开的分支
    如果我们在试图删除一个分支时自己还未转移到不同的分支(例如 master分支)上,Git 就会给出一个警告,并拒绝该删除操作。如果你坚持要删除该分支的话,就需要在命令中使用-D 选项。

    error: The branch 'b-branch' is not fully merged.
    If you are sure you want to delete it,run 'git branch -D b-branch'.
    > git branch -D b-branch
    Deleted branch b-branch(was 742dcf6).
    

Git会自行负责分支的管理,所以当我们删除一个分支时,Git只是删除了指向相关提 交的指针,但该提交对象依然会留在版本库中。因此,如果我们知道删除分支时的散列信
息,就可以将某个已删除的分支恢复过来。

  1. (在已知提交的散列值的情况下) 恢复某个分支
    > git branch a-branch 742dcf6
    
    1.1. 先确定相关的提交散列值
    如果我们不知道想要恢复分支的提交散列值,可以reflog 命令将它找出来。
    > git reflogd765ale HEAD@{0}: checkout: moving from b-branch to master88117f6 HEADC{1}: merge b-branch:Fast-forward9332b08 HEAD@{2}: checkout: moving from a-branch to b-branch 441cdef HEAD@{3}: commit: Expanded important stuff
    
    1.2. (通过 reflog 命令找到的散列值) 恢复该分支
    > git branch b-branch HEAD@{1}
    

7️⃣ 清理提交对象

gc 命令(gc 指的是垃圾回收) 可用于清理版本库,移除所有不属于当前分支的提交对象。 如果我们想进一步净化自己的版本库,可以先将它克隆一份,并删除其源版本库。


🌾 总结

  • 提交图中的分叉:主要是因为修复旧版本 bug 以及并行式开发的需要。
  • 分支:上述提交图中出现的那个分叉就叫做分支。该分支会有一个指针,指向该分支 下的最后一次提交。
  • 当前活跃分支:我们平常工作所在的就是所谓的当前活跃分支。当新的提交发生时, 该分支指针就会知道被设置到该新提交上。
  • 创建分支:我们可以用branch 命令来新建分支。
  • checkout: 我们可以用 checkout 命令切换到另一个分支上。
  • Reflog: git 会记录我们在每次提交中对分支指针所做的所有修改。如果你想恢复某个不小心删除的分支,这是非常有用的工具。
  • 垃圾处理:对于那些不属于任何分支前身的提交,我们将其视为垃圾,可以用 gc 命令将其清理掉。


温习回顾上一篇(点击跳转)
《【Git教程】(四)版本库 —— 存储系统,存储目录,提交对象及其命名、移动与复制~》

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

1

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

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

相关文章

2024热门UI设计工具推荐

最好的UI设计工具可以适应几乎每一个设计过程,并且有望满足您的创造性要求。但既然UI设计工具那么多,应该用什么工具呢? 在过去的几年里,Sketch和figma的结合一直是许多设计师的选择,但其他工具也提供了有竞争力的特点…

LeetCode 刷题 [C++] 第240题.搜索二维矩阵 II

题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 题目分析 通过分析矩阵的特点发现,其左下角和右上角可以看作一个“二叉搜索树的根节…

C++ 补充之常用遍历算法

C遍历算法和原理 C标准库提供了丰富的遍历算法,涵盖了各种不同的功能。以下是一些常见的C遍历算法以及它们的概念和原理的简要讲解: for_each:对容器中的每个元素应用指定的函数。 概念:对于给定的容器和一个可调用对象&#xff…

Docker 常用操作命令备忘

Docker 一旦设置好了环境,日常就只要使用简单命令就可以运行和停止。 于是,我每次用的时候,都想不起来一些关键性的命令到底怎么用,特此记录。 一、镜像管理 从公有仓库拉取镜像 (对于使用苹果电脑 M1/M2/M3 芯片的 …

[源码分析]webrtc音频流从接收到播放的关键流程

如图所示,音频流从接收到播放的核心关键流程和执行线程。 neteq中对音频流的RTP数据包进行了处理和解码操作。同时数据出现了跨线程的投递。 后面有空补上核心对象之间的关系图。 后面将添加对neteq模块的细节分析。

【.NET Core】深入理解IO之File类

【.NET Core】深入理解IO之File类 文章目录 【.NET Core】深入理解IO之File类一、概述二、File类2.1 File.AppendAllLines方法2.2 File.AppendAllText方法2.3 File.Copy 方法2.4 File.Create 方法2.5 File.Decrypt(String) 方法2.6 File.Delete(String) 方法2.7 File.Move 方法…

18 SpringMVC实战

18 SpringMVC实战 1. 课程介绍2. Spring Task定时任务1. 课程介绍 2. Spring Task定时任务 package com.imooc.reader.task

安全防御-第六次

内容安全 攻击可能只是一个点,防御需要全方面进行 DFI和DPI技术--- 深度检测技术 DPI --- 深度包检测技术--- 主要针对完整的数据包(数据包分片,分段需要重组),之后对数据包的内容进行识别。(应用层&…

NerfStudio安装及第一个场景重建

NerfStudio文档是写在windows和linux上安装,本文记录Linux安装的过程,且我的cuda是11.7 创建环境 conda create --name nerfstudio -y python3.8 conda activate nerfstudio python -m pip install --upgrade pip Pytorch要求2.0.1之后的,文档推荐cud…

CSS——PostCSS简介

文章目录 PostCSS是什么postCSS的优点补充:polyfill补充:Stylelint PostCSS架构概述工作流程PostCSS解析方法PostCSS解析流程 PostCSS插件插件的使用控制类插件包类插件未来的CSS语法相关插件后备措施相关插件语言扩展相关插件颜色相关组件图片和字体相关…

【ArcGIS】基本概念-空间参考与变换

ArcGIS基本概念-空间参考与变换 1 空间参考与地图投影1.1 空间参考1.2 大地坐标系(地理坐标系)1.3 投影坐标系总结 2 投影变换预处理2.1 定义投影2.2 转换自定义地理(坐标)变换2.3 转换坐标记法 3 投影变换3.1 矢量数据的投影变换…

广和通发布基于MediaTek T300平台的RedCap模组FM330系列及解决方案

世界移动通信大会MWC 2024期间,广和通发布基于MediaTek T300平台的RedCap模组FM330系列,加速5G-A繁荣发展。FM330系列及其解决方案采用全球先进RedCap方案,满足移动宽带和工业互联对高能效的需求。 广和通FM330系列采用全球首款6nm制程且集成…

配置与管理Samba服务器

配置与管理samba服务器 1,作用:可以使用户在异构网络操作系统之间进行文件系统共享 2,**SMB协议:**主要是作为Microsoft网络的通讯协议;一般端口使用为139,445。 3,功能:1&#x…

SpringMVC 学习(九)之拦截器

目录 1 拦截器介绍 2 创建一个拦截器类 3 配置拦截器 1 拦截器介绍 在 SpringMVC 中,拦截器 (Interceptor) 是一种用于拦截 HTTP 请求并在请求处理之前或之后执行自定义逻辑的组件。拦截器可以用于实现以下功能: 权限验证:在请求处理之前…

Tuning Language Models by Proxy

1、写作动机: 调整大语言模型已经变得越来越耗资源,或者在模型权重是私有的情况下是不可能的。作者引入了代理微调,这是一种轻量级的解码时算法,它在黑盒 大语言模型 之上运行,以达到直接微调模型的结果,但…

MSSQL 获取表对应的列明,备注,字段类型

旧系统代码CV多了想解放一下双手写个代码生成器,这时候就需要获取到表的某一些信息了 SELECT a.NAME AS colname,CONCAT(UPPER(SUBSTRING(b.name, 1, 1)), LOWER(SUBSTRING(b.name, 2,LEN(b.name)-1))) AS typename,a.length AS length,a.scale AS scale, a.prec A…

《opencv实用探索·二十二》支持向量机SVM用法

1、概述 在了解支持向量机SVM用法之前先了解一些概念: (1)线性可分和线性不可分 如果在一个二维空间有一堆样本,如下图所示,如果能找到一条线把这两类样本分开至线的两侧,那么这个样本集就是线性可分&#…

GIS之深度学习03:Anaconda无法正常启动问题汇总(更新)

在安装完成anaconda后,总会出现一些问题,以下为遇到的问题及解决方案: (有问题请私信,持续更新) 01:anaconda navigator启动时一直卡在 loading applications 页面 解决: 找到anac…

水库安全监测方案(福建地区水库安全监测案例分享)

我司星创易联最近在福建省受到了一个水库安全监测系统项目的委托。该水库位于福建中部山区,作为该地区的重要防洪与供水工程,对下游数十万人的生活产生重大影响。但是因为水库附近地质情况复杂,水库大坝在多次洪水冲击下出现一定病害,亟须全面加强对水库大坝安全状况的监测,以确…

使用Docker部署Nacos集群和Nginx高可用负载(9节点集群部署)

文章目录 🔊博主介绍🥤本文内容部署Nacos集群Nginx高可用负载 📢文章总结📥博主目标 🔊博主介绍 🌟我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专…