进阶 - Git的Bug分支

news2024/11/17 7:54:04

在这里插入图片描述

本篇文章,是基于我自用Linux系统中的自定义文件夹“test_rep”,当做示例演示

具体Git仓库的目录在:/usr/local/git/test_rep

Git的Bug分支

软件开发中,bug 就像家常便饭一样。有了 bug 就需要修复,在 Git 中,某种意义上每个 bug 都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

模拟Bug分支

假设当你接到一个修复一个代号101的 bug 的任务时,按照咱说的“某种意义”,想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交。

在模拟之前,我需要模拟的创建一个dev分支,并执行了几个操作:

$ git switch -c dev
Switched to a new branch 'dev'
#查看git工作区中的文件
$ ll
-rw-r--r-- 1 root root 158 Dec  6 19:47 read.txt
-rw-r--r-- 1 root root  21 Nov 30 15:06 test.txt

由上得知,有两个文件read.txttest.txt。此时追加一个文件:

$ touch Hello.java
#追加到暂存区
$ git add Hello.java
#查看一下仓库状态
$ git status
On branch dev
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   Hello.java

OK,并不是你不想提交,而是工作只进行到一半(摸鱼肯定是存在的,空文件而已),还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该 bug,怎么办?

Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

$ git stash
Saved working directory and index state WIP on dev: e7dcca3 ... #后面省略

现在,用git status查看工作区,就是干净的(除非有没有被 Git 管理的文件),因此可以放心地创建分支来修复bug。

$ git checkout master
On branch dev
nothing to commit, working tree clean

此时,就可以确定要在哪个分支上修复 bug,假定需要在master分支上修复,就从master创建临时分支:

#切换到master分支
$ git switch master
Switched to branch 'master'
#在master分支创建新分支并切换到新分支,假设文章前说的issue-101分支
$ git switch -c issue-101
Switched to a new branch 'issue-101'

现在修复 bug,假设 bug 在文件test.txt中:

#issue-101分支
#随便增加点什么
$ vim test.txt
#wq保存

提交修改的test.txt文件:

#issue-101分支
$ git add test.txt 
$ git commit -m 'fix bug 101'
[issue-101 a1ecaeb] fix bug 101
 1 file changed, 1 insertion(+)

修复完成后,切换到master分支,并完成合并,最后删除issue-101分支(删除不删除的看你心情吧):

$ git switch master
Switched to branch 'master'
$ git merge --no-ff -m "merged bug fix 101" issue-101
Merge made by the 'recursive' strategy.
 test.txt | 1 +
 1 file changed, 1 insertion(+)

只要不摸鱼,bug 修复也就几分钟的事!现在,是时候接着回到dev分支干活了:

$ git switch dev
Switched to branch 'dev'
#查看状态
$ git status
On branch dev
nothing to commit, working tree clean

工作区是干净的,别着急,刚才不是把工作现场“储藏”起来,用git stash list命令看看:

#dev分支下
$ git stash list
stash@{0}: WIP on dev: e7dcca3 用no-ff 测试merge	#此处会是您最会一次提交的注释,我这里是这样的

如上,stash@{0}可以粗浅的理解为 stash 的一个存储id,毕竟有时候可能有多个工作现场需要“储藏”;后面的 commit 注释是我本机测试环境下的,您的肯定会和我不不一样,当然你要是学着我来操作的,那就可能一样了。

继续,工作现场还在,Git 把 stash 内容存在某个地方了,但是需要恢复一下,有两个办法:

第一个办法是用git stash apply恢复,但是恢复后,stash 内容并不删除,你需要用git stash drop来删除;

第二个办法是用git stash pop,恢复的同时把 stash 内容也删了(这个是我想用的):

#dev分支下
$ git stash pop
On branch dev
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   Hello.java

Dropped refs/stash@{0} (2ff33b09d4ca086cd894dc73e96893119a7270f1)

再用git stash list查看,就看不到任何 stash 内容了:

$ git stash list

当然,你可以多次 stash,恢复的时候,先用git stash list查看,然后恢复指定的 stash,用命令:

$ git stash apply stash@{0} #通过刚才说的类似id的恢复 

到此,可以利用git status看看您一开始dev分支下的状态:

#dev分支下
$ git status

肯定又回到你刚才最早摸鱼的时候那种状态下。

回顾刚才的设想

刚才的操作是在 master 分支上修复了 bug 后,我们要想一想,dev 分支是早期从 master 分支分出来的,所以,这个 bug 其实在当前 dev 分支上也存在。

那怎么在 dev 分支上修复同样的 bug ?重复操作一次,提交不就行了?有木有更简单的方法?

有!

同样的 bug,要在 dev 上修复,我们只需要把刚才 commit时的那个fix bug 101这个提交所做的修改“复制”到 dev 分支。注意:我们只想复制fix bug 101这个提交所做的修改,并不是把整个 master 分支 merge 过来。

回看上面的博文,在我本机测试环境下,commit “fix bug 101”时,Git 给我反馈的是[issue-101 a1ecaeb] fix bug 101,其中我这里的a1ecaeb,是这次提交给定的 ID(注意,你的环境肯定和我的不一样),我们可以利用这个 ID 来操作,Git 专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支:

#dev分支下
#首先需要将所有的操作commit
#我这里只是追加了一个新的文件Hello.java
$ git commit -m 'append Hello.java'
[dev 274f6a9] append Hello.java
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 Hello.java
#将dev分支下所有的修改提交之后才可以执行cherry-pick
$ git cherry-pick a1ecaeb	#注意,这个id一定得是您测试环境下的id,这里id只是我这里测试的id,你我肯定不一样
[dev a845a9d] fix bug 101
 Date: Tue Dec 6 20:32:32 2022 +0800
 1 file changed, 1 insertion(+)

如上,将 dev 分支下所有的修改提交之后才可以执行cherry-pick。还有,刚才提到的那个 ID,如果您忘记了,完全可以切到 master分支下,通过git log查看到提交的日志信息,其中包括 ID。最后,Git 自动给dev分支做了一次提交,这个提交虽然是同步之前的 bug,但是它属于两个不同的提交,所以其 ID 肯定不同。

有些聪明的童鞋会想了,既然可以在 master 分支上修复 bug 后,在 dev 分支上可以“重放”这个修复过程,那么直接在 dev 分支上修复 bug,然后在 master 分支上“重放”行不行?当然可以,不过你仍然需要git stash命令保存现场,才能从 dev 分支切换到 master 分支。

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

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

相关文章

LabVIEW与工具包版本的不兼容问题

前面的文章有介绍过&#xff0c;LabVIEW可以看做是一种编程语言&#xff0c;同时NI也在LabVIEW里提供了非常多的可快速构建专业应用的工具包模块&#xff0c;这些模块有的是用于专业数据采集的&#xff0c;有的是用于图像处理的&#xff0c;还有的可能是工业控制的。个人觉得这…

记一次InputStream流读取不完整留下的惨痛教训

前言 首先&#xff0c;问问大家下面这段流读取的代码是否存在问题呢&#xff1f; inputStream .... try {// 根据inputStream的长度创建字节数组byte[] arrayOfByte new byte[inputStream.available()];// 调用read 读取字节数组inputStream.read(arrayOfByte, 0, arrayOfB…

计算机毕业设计ssm+vue基本微信小程序的健康管理系统 uniapp 小程序

项目介绍 本文介绍了使用微信小程序技术开发健康管理系统的设计与实现过程,首先对实现该系统的技术进行分析,说明选择Java后台技术和MySQL数据库的必要性,然后对基于微信小程序的健康管理系统的需求进行分析。并接着对系统进行设计,包括架构设计、功能设计、数据库设计。最后进…

基于改进遗传算法把电力系统功率损耗降至最低(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f389;作者研究&#xff1a;&#x1f3c5;&#x1f3c5;&#x1f3c5;本科计算机专业&#xff0c;研究生电气学硕…

软件测试用例

测试用例为什么要写测试用例测试用例的基本要素QQ登录的测试用例功能正常时异常时界面易用性可移植性性能具体的设计测试用例的方法等价类边界值错误猜测法场景设计法因果图法正交排列测试用例的有效性为什么要写测试用例 测试用例是测试执行的依据测试用例可以复用&#xff0…

分布式多级缓存

学习就是带着问题前行 缓存是什么&#xff1f; 缓存击穿是什么&#xff1f; 缓存雪崩是什么&#xff1f; 如何保证分布式缓存的数据一致性&#xff1f; 如何进行缓存预热&#xff1f; 如何设计缓存热点探测&#xff1f; 曾经问过一个技术修为很高的朋友&#xff0c;为什么…

系统移植 uboot 1

一、uboot概念 1.1 uboot和bootloader关系 1.bootloader:是一系列引导加载程序的统称 &#xff0c;uboot是其中之一。 1.2 uboot特点 1.uboot是由德国DNEX小组进行维护的 2.uboot是一个开源分布式系统 3.uboot支持多种硬件架构平台(ARM/X86/POWERPC) 4.uboot短小精悍 5.…

飞轮效应,中国企业级SaaS的一次自我革命

“数智飞轮”“客户成功”&#xff0c;三年时间&#xff0c;用友YonSuite终于按下了发展的“快进键”&#xff0c;中国企业级SaaS的产业革命也就此开始。 前不久&#xff0c;用友发布了2022年三季报。在公司战略增强公有云订阅业务的前提下&#xff0c;中型企业云服务业务收入…

模拟电路设计(38)---基于LT1173的负压产生电路

今天来介绍下LT1173在buck&#xff08;step-down&#xff09;模式的工作电路。在介绍PWM电路结构时&#xff0c;有一种形式成为buck型&#xff0c;如下所示&#xff1a; 晶体管开关变换器&#xff08;buck&#xff09;电路 LT1173提供了内置开关管的集电极和发射极管脚&#x…

【图像处理OpenCV(C++版)】——2.2 OpenCV之矩阵运算详解(全)

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义&#xff0c;适用于平时学习、工作快…

一篇文章让你认识与学习bash(干货满满)

Linux界存在着这样一种说法&#xff1a;“在Linux的环境下&#xff0c;如果你不懂bash是什么&#xff0c;那么其他的东西就不用学了。”bash的学习是所有命令行模式与未来主机维护与管理的重要基础&#xff0c;所以得认真对待。 一.硬件、内核与shell 1.1 什么是shell? 看下图…

Linux下安装mysql5.7.18

查询mysql的安装文件&#xff1a; find / -name mysql有安装mysql的路径&#xff0c;有是存放MySQL安装包的路径 卸载mysql: 删除安装路劲 rm -rf /opt/mysql删除配置文件 rm -rf /etc/my.cnf删除/etc/init.d/下跟mysql有关的全部文件&#xff0c;一般包括mysql文件或mys…

浅尝Go语言的协程实现

文章目录为什么需要协程协程的本质协程如何在线程中执行GMP调度模型协程并发为什么需要协程 协程的本质是将一段数据的运行状态进行打包&#xff0c;可以在线程之间调度&#xff0c;所以协程就是在单线程的环境下实现的应用程序级别的并发&#xff0c;就是把本来由操作系统控制…

微服务框架 SpringCloud微服务架构 25 黑马旅游案例 25.1 搜索、分页

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构25 黑马旅游案例25.1 搜索、分页25.1.1 直接开干25 黑马旅游案例 25.1 搜…

PyTorch~自定义数据读取

这次是PyTorch的自定义数据读取pipeline模板和相关trciks以及如何优化数据读取的pipeline等。 因为有torch也放人工智能模块了~ 从PyTorch的数据对象类Dataset开始。Dataset在PyTorch中的模块位于utils.data下。 from torch.utils.data import Dataset围绕Dataset对象分别从…

前端入门必备基础

化繁为简 HTML5要的就是简单、避免不必要的复杂性。HTML5的口号是“简单至上&#xff0c;尽可能简化”。因此&#xff0c;HTML5做了以下改进&#xff1a; 以浏览器原生能力替代复杂的JavaScript代码。 新的简化的DOCTYPE。 新的简化的字符集声明。 简单而强大的HTML5API。…

[附源码]Python计算机毕业设计SSM基于云数据库的便民民宿租赁系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

《Linux运维实战:MongoDB数据库全量逻辑备份恢复(方案一)》

一、备份与恢复方案 mongodump是MongoDB官方提供的备份工具,它可以从MongoDB数据库读取数据,并生成BSON文件,mongodump适合用于备份和恢复数据量较小的MongoDB数据库, 不适用于大数据量备份。 默认情况下mongodump不获取local数据库里面的内容。mongodump仅备份数据库中的文档&…

回溯算法(1)组合

文章目录回溯算法理论77. 组合216. 组合总和17. 电话号码的组合回溯算法理论 回溯算法其实就是递归&#xff0c;只不过递归又分为递去和归来&#xff0c;其中归来便就是回溯。 为什么要使用回溯&#xff1f; 有些问题我们通过暴力解法也很难解决&#xff0c;比如说我们接下来…

C语言学习之路(高级篇)—— 变量和内存分布(上)

说明&#xff1a;该篇博客是博主一字一码编写的&#xff0c;实属不易&#xff0c;请尊重原创&#xff0c;谢谢大家&#xff01; 数据类型 1) 数据类型概念 什么是数据类型&#xff1f;为什么需要数据类型? 数据类型是为了更好进行内存的管理&#xff0c;让编译器能确定分配…