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

news2025/1/23 22:40:23

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 branch
  a-branch
* master
  still-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-branch
    	error:Your local changes to the following files would be overwritten by checkout:foo.txt
    	Please,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 reflog
    	d765ale HEAD@{0}: checkout: moving from b-branch to master
    	88117f6 HEADC{1}: merge b-branch:Fast-forward
    	9332b08 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.coloradmin.cn/o/1474585.html

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

相关文章

在PyCharm中使用Git

安装Git CMD检查Git版本 打开cmd,输入git version,检查当前下载版本 配置git的user信息 在cmd中输入 git config --global user.name "用户名"git config --global user.email "用户邮箱"输入:git config --list&…

自然语言处理: 第十三章Xinference部署

项目地址: Xorbitsai/inference 理论基础 正如同Xorbits Inference(Xinference)官网介绍是一个性能强大且功能全面的分布式推理框架。可用于大语言模型(LLM),语音识别模型,多模态模型等各种模型的推理。通…

安装极狐GitLab Runner并测试使用

本文继【新版极狐安装配置详细版】之后继续 1. 添加官方极狐GitLab 仓库: 对于 RHEL/CentOS/Fedora: curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash2. 安装最新版本的极狐G…

node.js 用 xml2js.Parser 读 Freeplane.mm文件,生成测试用例.csv文件

Freeplane 是一款基于 Java 的开源软件,继承 Freemind 的思维导图工具软件,它扩展了知识管理功能,在 Freemind 上增加了一些额外的功能,比如数学公式、节点属性面板等。 编写 mm_xml2js_csv.js 如下 // 用 xml2js.Parser 读 F…

设计模式-代理模式(静态代理,动态代理)

定义 代理模式Proxy是⼀种结构型设计模式,能够增强一些功能,不会影响到之前核心功能的流程。 结构图 1 通过实现接口的方式 2 通过继承类的方式 代理模式与装饰器模式 IT老齐白话设计模式 装饰和代理有着相似的结构, 但是其意图却⾮常…

腾讯云4核8G服务器优惠价格表(轻量+CVM)

腾讯云4核8G服务器多少钱?轻量应用服务器4核8G12M带宽一年446元、646元15个月,云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元,5年6490.44元,标准型SA2服务器1444.8元一年,在txy.wiki可以查询详细配置和精准报价…

DAY12_VUE基本用法详细版

目录 0 HBuilderX酷黑主题修改注释颜色1 VUE1.1 VUE介绍1.2 Vue优点1.3 VUE入门案例1.3.1 导入JS文件1.3.2 VUE入门案例 1.4 VUE基本用法1.4.1 v-cloak属性1.4.2 v-text指令1.4.3 v-html指令1.4.4 v-pre指令1.4.5 v-once指令1.4.6 v-model指令1.4.7 MVVM思想 1.5 事件绑定1.5.1…

C# OpenCvSharp DNN Yolov8-OBB 旋转目标检测

目录 效果 模型信息 项目 代码 下载 C# OpenCvSharp DNN Yolov8-OBB 旋转目标检测 效果 模型信息 Model Properties ------------------------- date:2024-02-26T08:38:44.171849 description:Ultralytics YOLOv8s-obb model trained on runs/DOT…

【.Net 使用阿里云OSS 存储文件】

一、使用NuGet安装【Aliyun.OSS.SDK】 注意:如果有多个项目,需要在具体使用的项目跟启动项目都安装同一版本的Aliyun.OSS.SDK 二、上传代码 using Aliyun.OSS; using System.IO; using System; using CadApplication.Service.Dto; using System.Net; us…

Excel 使用空格或TAB分列

1 选择“数据”>“分列”。 在“文本分列向导”中,选择“分隔符号”>“下一步”。 选择数据的“分隔符”。 例如,“逗号”和“空格”。 可在“数据预览”窗口预览数据。 选择“下一步”,在工作表 目标,在工作表中想显示拆分…

51单片机-(定时/计数器)

51单片机-(定时/计数器) 了解CPU时序、特殊功能寄存器和定时/计数器工作原理,以定时器0实现每次间隔一秒亮灯一秒的实验为例理解定时/计数器的编程实现。 1.CPU时序 1.1.四个周期 振荡周期:为单片机提供定时信号的振荡源的周期…

go环境安装-基于vscode的Windows安装

1、vscode安装 官网链接:https://code.visualstudio.com/ 选择相应的版本,这里选择Windows下的 下载得到一个VSCodeUserSetUp-x64的可执行文件,双击执行,选择要安装的路径,下一步。 2、go语言安装 官网链接&#x…

node.js提取excel中的信息填充到word文件,批量生成合同

1.npm下载 npm i pizzip docxtemplater xlsx 2.excel模板 3.word模板 4.代码 // 引入所需模块 var PizZip require(pizzip); var Docxtemplater require(docxtemplater); var fs require(fs); var path require(path); var xl require(xlsx);// 读取并导出Excel文件 …

langChain学习笔记(待续)

目录 IntroductionLLM的限制扩展理解:什么是机器学习扩展阅读:机器学习的流程 LangChain Introduction LLM的限制 大型语言模型,比如ChatGpt4,尽管已经非常强大,但是仍然存在一些限制: 知识更新&#xff…

开源现场总线协议栈(ethercat、ethernet/ip、opc ua、profinet、canopen、modbus)

ecat主站及其相关: 1.soem:GitHub - OpenEtherCATsociety/SOEM: Simple Open Source EtherCAT MasterSimple Open Source EtherCAT Master. Contribute to OpenEtherCATsociety/SOEM development by creating an account on GitHub.https://github.com/…

ARM系列 -- 虚拟化(一)

今天来研究一个有意思的话题,虚拟化(virtualization)。 开始前,先闲扯一下,最近一个词比较火,“元宇宙(Metaverse)”。在维基百科里面是这么定义元宇宙的,“The Metaver…

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…

京东数据分析(电商数据分析):2024年1月京东白酒TOP10品牌销量销额排行榜

在公布2024年1月京东白酒品牌排行榜之前,分享一个有点意思的现象:在今年龙年春晚“黄金5分钟”的广告片里,白酒局知名的品牌基本都亮相了(茅台、五粮液、洋河股份、郎酒、古井贡酒、水井坊),但今年汾酒却缺…

Thread多线程(创建,方法,安全,通信,线程池,并发,并行,线程的生命周期)【全详解】

目录 1.多线程概述 2.多线程的创建 3.Thread的常用方法 4.线程安全 5.线程同步 6.线程通信 7.线程池 8.其它细节知识:并发、并行 9.其它细节知识:线程的生命周期 1.多线程概述 线程是什么? 线程(Thread)是一个程序内部的一条执行…

安全运营中心(SOC)综合指南

什么是安全运营中心(SOC) 安全运营中心,也称为信息安全运营中心 (ISOC),是结构良好的网络安全战略的核心。安全运营中心是一个集中式枢纽,无论是在组织内部还是外包,都致力于对整个…