【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-branch1b. 为任意一批提交创建分支
我们也可以为任意一批提交创建新的分支。为此,我们必须要指定该分支上的第一次提交。git branch still-a-branch 38b7da45e1c. 从现有分支中创建分支
git branch still-a-branch older-branch2.切换到新分支
branch命令只能用于创建新的分支,但并不会自动切换到该新分支上。如果我们想要
切换到新的分支上,就得使用checkout命令。git checkout a-branch快捷方式:创建并切换到新分支
git checkout -b a-branch
通常情况下,我们可以用 checkout 命令在分支之间来回切换。但是,如果这时候工作 区还存在着一些修改,我们就必须要先决定好如何处理这部分修改。
-
进行 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如你所见,工作区或暂存区存在着一些修改,它们还没有被确认为一次提交。所以我们必须先决定以下何种方式来处理这些修改。
-
提交修改并切换
> git commit --all > git checkout a-branch -
放弃这部分修改并进行切换
我们可以用 --force 选项来进行强制切换,但这样做会令这部分修改被覆盖!> git checkout --force a-branch -
储藏修改并切换
我们可以用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 命令来删除分支。
-
删除一个已被终止的分支
> git branch -d b-branch -
删除一个打开的分支
如果我们在试图删除一个分支时自己还未转移到不同的分支(例如 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.1. 先确定相关的提交散列值> git branch a-branch 742dcf6
如果我们不知道想要恢复分支的提交散列值,可以reflog命令将它找出来。
1.2. (通过> 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 stuffreflog命令找到的散列值) 恢复该分支> git branch b-branch HEAD@{1}
7️⃣ 清理提交对象
gc 命令(gc 指的是垃圾回收) 可用于清理版本库,移除所有不属于当前分支的提交对象。 如果我们想进一步净化自己的版本库,可以先将它克隆一份,并删除其源版本库。
🌾 总结
- 提交图中的分叉:主要是因为修复旧版本 bug 以及并行式开发的需要。
- 分支:上述提交图中出现的那个分叉就叫做分支。该分支会有一个指针,指向该分支 下的最后一次提交。
- 当前活跃分支:我们平常工作所在的就是所谓的当前活跃分支。当新的提交发生时, 该分支指针就会知道被设置到该新提交上。
- 创建分支:我们可以用
branch命令来新建分支。 - checkout: 我们可以用
checkout命令切换到另一个分支上。 - Reflog: git 会记录我们在每次提交中对分支指针所做的所有修改。如果你想恢复某个不小心删除的分支,这是非常有用的工具。
- 垃圾处理:对于那些不属于任何分支前身的提交,我们将其视为垃圾,可以用
gc命令将其清理掉。
《【Git教程】(四)版本库 —— 存储系统,存储目录,提交对象及其命名、移动与复制~》
1
相关文章:
【Git教程】(五)分支 —— 并行式开发,分支相关操作(创建、切换、删除)~
Git教程 分支 1️⃣ 并行式开发2️⃣ 修复旧版本中的 bug3️⃣ 分支4️⃣ 当前活跃分支5️⃣ 重置分支指针6️⃣ 删除分支7️⃣ 清理提交对象🌾 总结 对于版本提交为什么不能依次进行,以便形成一条直线型的提交历史记录,我们认为有 以下两个…...
Maven管理项目,本地仓库有对应的jar包,但还是报找不到
文章目录 业务场景错误提示分析过程解决办法 业务场景 settings.xml种配置了私服,但是有些依赖私服上没有,通过同事拷贝过来的。但是用maven打包时报红了。 错误提示 Idea Maven错误:was cached in the local repository, resolution will…...
手写JavaScript中的Promise.all方法(JS中Promise.all的执行过程)
简介: Promise.all是JavaScript中一种用于处理多个Promise对象的方法,该方法接收一个数组作为参数,并返回一个新的Promise对象。 这个新的对象会在所有Promise对象都成功解析后解析,解析的结果是一个数组,包含了所有P…...
IP设置教程
Win 7 固定Ip设定 https://jingyan.baidu.com/article/4b07be3cbc8e7348b380f31d.html Win 10 固定Ip设定 Win10 固定IP地址方法_win10设置固定ip地址怎么设置-CSDN博客 Win 11 固定Ip设定 https://jingyan.baidu.com/article/cb5d6105be5354415c2fe0d3.html TP-LINK…...
【Azure 架构师学习笔记】-Azure Synapse -- Link for SQL 实时数据加载
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Synapse】系列。 前言 Azure Synapse Link for SQL 可以提供从SQL Server或者Azure SQL中接近实时的数据加载。通过这个技术,使用SQL Server/Azure SQL中的新数据能够几乎实时地传送到Synapse(…...
k8s(5)
目录 使用Kubeadm安装k8s集群: 初始化操作: 每台主从节点: 升级内核: 所有节点安装docker : 所有节点安装kubeadm,kubelet和kubectl: 修改了 kubeadm-config.yaml,将其传输给…...
【服务器数据恢复】ext3文件系统下硬盘坏道掉线的数据恢复案例
服务器数据恢复环境: 一台IBM某型号服务器上有16块FC硬盘组建RAID阵列。上层linux操作系统,ext3文件系统,部署有oracle数据库。 服务器故障&检测: 服务器上跑的业务突然崩溃,管理员发现服务器上有2块磁盘的指示灯…...
Sentinel 动态规则扩展
一、规则 Sentinel 的理念是开发者只需要关注资源的定义,当资源定义成功后可以动态增加各种流控降级规则。Sentinel 提供两种方式修改规则: 通过 API 直接修改 (loadRules)通过 DataSource 适配不同数据源修改 手动通过 API 修改比较直观,…...
UE5 UE4 自定义插件自动开启关联插件(plugin enable)
在我们自己编写UE4、UE5的插件时,常常需要开启相关联的插件进行功能编写。 例如:UE4/5 批量进行贴图Texture压缩、修改饱和度_ue4批量修改纹理大小-CSDN博客 而让插件使用者每次使用时,依次进行开启其他相关联插件确实有些麻烦。 如何只需要…...
Android摄像头横屏的时候_人脸预览横向显示_问题解决---Android原生开发工作笔记164
在Android系统的平板中发现一个问题,我们做的一个Android程序,横屏的时候,摄像头在上面, 然后这个时候程序中的一个人脸预览页面,横向手持平板,摄像头在上面,但是这个时候预览的摄像头画面却是很像头像朝左,也是横过来的. private int getCameraOrientation(int cameraId) {Ca…...
网络安全防御保护 Day6
深度检测技术 DFI(深度包检测技术):主要针对完整的数据包(数据包分片,分段需要重组),之后对 数据包的内容进行识别。 DPI(深度流检测技术):一种基于流量…...
自动驾驶消息传输机制-LCM
需要用到LCM消息通讯,遂研究下。 这里写目录标题 1 LCM简介2. LCM源码分析3 LCM C教程与实例3.1 安装配置及介绍3.2 创建类型定义3.3 初始化LCM3.4 发布publish一个消息3.5 订阅和接收一个消息3.6 LCM进程间通讯3.7 注意事项?3.7.1 当数据结构定义的是数…...
架构设计实践:熟悉架构设计方法论,并动手绘制架构设计图
文章目录 一、架构设计要素1、架构设计目标2、架构设计模式(1)分而治之(2)迭代式设计 3、架构设计的输入(1)概览(2)功能需求 - WH分析法(3)质量 - “怎么”分…...
【推荐算法系列十六】:协同过滤
文章目录 参考原理基于邻域的协同过滤算法基于用户的协同过滤(User-Based Collaborative Filtering)基于内容的协同过滤 基于模型的协同过滤算法 扩展优缺点 参考 推荐系统之神经协同过滤 原理 基于邻域的协同过滤算法 基于邻域的协同过滤算法又包括…...
linux动态库加载相关
linux下动态库搜索规则 (1)编译目标代码时指定的动态库搜索路径,也就是RPATH; (2)环境变量LD_LIBRARY_PATH指定的动态库搜索路径; (3)配置文件/etc/ld.so.conf中指定的动态库搜索路径;配置完毕后需运行ldconfig命令生效; (4)默…...
python 基础绘图函数 实例
简介 在 Python 中,有许多用于绘图的库。以下是一些常用的 Python 绘图库及其基本绘图函数的简要介绍: Matplotlib: matplotlib.pyplot.plot(x, y): 绘制线图。matplotlib.pyplot.scatter(x, y): 绘制散点图。matplotlib.pyplot.bar(x, height): 绘制条…...
28. 找出字符串中第一个匹配项的下标(力扣LeetCode)
文章目录 28. 找出字符串中第一个匹配项的下标题目描述暴力KMP算法 28. 找出字符串中第一个匹配项的下标 题目描述 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。…...
1 开源鸿蒙OpenHarmony niobe407 STM32F407IGT6芯片轻型系统全量源码4.1版本下载流程
开源鸿蒙OpenHarmony niobe407 STM32F407IGT6芯片轻型系统全量源码4.1版本下载流程 作者将狼才鲸日期2024-02-27 一、前景提要 如果通过DevEco Marketplace网站获取下载源码的话,不全,有些板子下不到;OpenHarmony开发板列表,官方…...
洛谷C++简单题小练习day21—梦境数数小程序
day21--梦境数数--2.25 习题概述 题目背景 Bessie 处于半梦半醒的状态。过了一会儿,她意识到她在数数,不能入睡。 题目描述 Bessie 的大脑反应灵敏,仿佛真实地看到了她数过的一个又一个数。她开始注意每一个数码(0…9&#x…...
LabVIEW高精度闭式微小型循环泵性能测试
LabVIEW高精度闭式微小型循环泵性能测试 开发了一套基于LabVIEW的高精度闭式微小型循环泵性能测试系统,旨在通过先进的测试技术和虚拟仪器技术,对微小型循环泵的性能进行精确测量和分析,从而优化泵的设计和性能,提高其在航空、机…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
