Git企业开发控制理论和实操-从入门到深入(三)|分支管理

前言

那么这里博主先安利一些干货满满的专栏了!

首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。

  • 高质量博客汇总

然后就是博主最近最花时间的一个专栏《Git企业开发控制理论和实操》希望大家多多关注!

  • Git企业开发控制理论和实操

Git的分支管理

我们继续在上一章创建的本地仓库中继续进行分支的学习。

分支创建、切换、合并的简单尝试

git branch # 查看本地有哪些分支

在这里插入图片描述
前面的*是什么?

我们前面说到,HEAD一开始是指向master的,但HEAD不是只能指向master的,而是可以指向其他分支。

然后被HEAD指向的分支才是工作分支。

如何创建一个本地的分支呢?

git branch dev # 创建一个名为dev的分支

在这里插入图片描述
发现多了一个dev

但此时HEAD还是指向master的。我们打印一下HEAD就能看到。
在这里插入图片描述
同样,tree一下.git/也可以看到新建的dev

在这里插入图片描述
此时我们可以把devmaster的内容都打印一下。
在这里插入图片描述
我们知道master里面是上一次提交的commit id,我们发现dev里面也是。所以现在分支的状态如下图所示。

在这里插入图片描述
两个“指针”,都指向最新的提交,HEAD指向master

然后现在我想在dev分支上进行操作,我们就要让HEAD指针指向dev,而不是master

git checkout dev

通过这个命令可以把HEAD指向dev分支,让dev成为工作分支。
在这里插入图片描述
现在的工作分支就是dev了。

现在我们对README.md文件进行一下修改。
在这里插入图片描述
然后提交。
在这里插入图片描述
此时的README.md(dev分支上的)是有hello branch的。

我们切换回master分支,再看看README.md长啥样。
在这里插入图片描述
我们发现是没有hello branch的!

因为我们刚才的修改,在dev分支上。

刚才的这几个步骤的图示如下。
在这里插入图片描述
现在我们想要在master上也拿到dev上的代码,那就要合并!

注意:现在是想要在master上获得dev的分支,就是dev合并到master中,注意表达和顺序,是反过来是不一样的。

首先先要checkoutmaster上来。

git checkout master

然后使用合并命令。

git merge dev # 合并

在这里插入图片描述

我们看到这里面的Fast-forward表示快速提交。本质上就是把master的指针改一下就行了,所以是很快的。

到后面我们会讲不是Fast-forward的情况。

流程就是这个样子的。
在这里插入图片描述
当然,在这过程中还会存在很多的问题,我们在后面再一一解释。

删除分支

我们在上一小节,创建了dev分支,然后做一些修改,然后合并了。

意味着dev分支的使命已经结束了。我们就要删除dev分支。

git branch -d dev

注意:

  • 只能在其他分支上删除分支,也就是说我们不能在dev上删除dev分支,否则会报错。
    在这里插入图片描述

为什么需要分支

因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

合并冲突

合并的时候是最容易出现问题的。

比如说现在有一个README.md文件,创建dev分支后,多加了一行:bbb on dev branch

master也没闲着,也多加了一行:ccc on dev branch

git是不知道在合并的时候保留bbb的这一行还是保留ccc的这一行的。

这种情况叫做合并冲突。

我们先把上述的情况准备好。

在这里插入图片描述

其实有一行命令,可以同时做到:创建分支+checkout到这个新创建的分支上。

git checkout -b dev1 # 创建dev1分支,并切换到dev1分支下

此时的状态就是这样的。

在这里插入图片描述
此时merge就会发生冲突,我们来试一下。
在这里插入图片描述
合并失败。

在这里插入图片描述

此时,git帮我们修改了一下代码,如图所示,把HEAD和dev1中的都放在一起了。

然后刚才的冲突提示是:Automatic merge failed; fix conflicts and then commit the result.

因此就是让我们自己手动改一下,然后重新提交。

所以现在我们选择保留bbb那一行,直接删掉其他代码就行了。

在这里插入图片描述

重新提交后即可,此时仓库的状态是这样的。
在这里插入图片描述

  • 注意:因为是mastermergedev,所以master此时是最新的提交,也就是我们fix冲突后的提交,但是此时dev依旧还是刚才dev的提交。

其实 git log 可以帮我们画这些图,画给我们看。

git log --graph --abbrev-commit

效果如下所示:

(base) [yufc@ALiCentos7:~/Src/Bit-Courses/GitDevelopment/gitcode]$ git log --graph --abbrev-commit
*   commit ce635d4
|\  Merge: c007412 fd4e0b0
| | Author: Yufccode <xxx@qq.com>
| | Date:   Wed Aug 23 22:51:22 2023 +0800
| | 
| |     fix conflict
| |   
| * commit fd4e0b0
| | Author: Yufccode <xxx@qq.com>
| | Date:   Wed Aug 23 22:42:45 2023 +0800
| | 
| |     bbb on dev1
| |   
* | commit c007412
|/  Author: Yufccode <xxx@qq.com>
|   Date:   Wed Aug 23 22:42:03 2023 +0800
|   
|       ccc on master
|  
* commit 48cc733
| Author: Yufccode <xxx@qq.com>
| Date:   Tue Aug 22 23:27:07 2023 +0800
| 
|     modify readme
:...skipping...
*   commit ce635d4
|\  Merge: c007412 fd4e0b0
| | Author: Yufccode <xxx@qq.com>
| | Date:   Wed Aug 23 22:51:22 2023 +0800
| | 
| |     fix conflict
| |   
| * commit fd4e0b0
| | Author: Yufccode <xxx@qq.com>
| | Date:   Wed Aug 23 22:42:45 2023 +0800
| | 
| |     bbb on dev1
| |   
* | commit c007412
|/  Author: Yufccode <xxx@qq.com>
|   Date:   Wed Aug 23 22:42:03 2023 +0800
|   
|       ccc on master
|  
* commit 48cc733
| Author: Yufccode <xxx@qq.com>
| Date:   Tue Aug 22 23:27:07 2023 +0800
| 
|     modify readme
|  
* commit 130a873
| Author: Yufccode <xxx@qq.com>
| Date:   Mon Aug 21 23:04:55 2023 +0800
| 
|     modify README.md
|  
* commit f42df14
:...skipping...
*   commit ce635d4
|\  Merge: c007412 fd4e0b0
| | Author: Yufccode <xxx@qq.com>
| | Date:   Wed Aug 23 22:51:22 2023 +0800
| | 
| |     fix conflict
| |   
| * commit fd4e0b0
| | Author: Yufccode <xxx@qq.com>
| | Date:   Wed Aug 23 22:42:45 2023 +0800
| | 
| |     bbb on dev1
| |   
* | commit c007412
|/  Author: Yufccode <xxx@qq.com>
|   Date:   Wed Aug 23 22:42:03 2023 +0800
|   
|       ccc on master
|  
* commit 48cc733
| Author: Yufccode <xxx@qq.com>
| Date:   Tue Aug 22 23:27:07 2023 +0800
| 
|     modify readme
|  
* commit 130a873
| Author: Yufccode <xxx@qq.com>
| Date:   Mon Aug 21 23:04:55 2023 +0800
| 
|     modify README.md
|  
* commit f42df14
| Author: Yufccode <xxx@qq.com>
| Date:   Mon Aug 21 12:26:23 2023 +0800
| 
|     my second add
|  
:

最上面的就是最新我们的操作。

合并模式

其实在这一章节里面,我们的实验有两次merge,分别对应了两种合并模式。

  • 第一种其实就是:Fast-forward模式,前面讲过的。

  • 第二种就是第二次我们merge,需要解决冲突,称为:no-ff模式

Fast forward模式下,删除分支后,查看分支历史时,会丢掉分支信息,看不出来最新提交到底是merge进来的还是正常提交的。
但在合并冲突部分,我们也看到通过解决冲突问题,会再进行一次新的提交。

no-ff模式,这样的好处是,从分支历史上就可以看出分支信息。例如我们现在已经删除了在合并冲突部分创建的 dev1 分支,但依旧能看到 master 其实是由其他分支合并得到。

Git允许我们禁用Fast-forward模式。

git merge --no-ff -m "merge dev2" dev # 禁用ff模式进行merge, 因为no-ff模式需要再次进行提交,所以要-m带上提交的信息

分支策略

在这里插入图片描述
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活。

那在哪干活呢? 干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

所以,团队合作的分支看起来就像这样:
在这里插入图片描述
因此,Git的分支功能是非常重要的!!!

BUG分支

如果master上有bug呢?

想象一种场景:master正在运行,然后dev2分支正在做开发,但是还没有提交,此时master突然出现bug了。

我们先模拟一下这种场景。
在这里插入图片描述
此时我们dev2分支上正在开发,然后此时master遇到了bug。

能不能在dev2分支上处理bug呢?肯定是不行的,因为dev2分支是用来开发某个功能的。

那好,现在我们就要切回去master上去处理,但是此时我dev2上还没提交,所以切过去处理我工作区的东西就不见了。所以需要一个命令,先把dev2上工作区的内容先保存一下先,然后再到master上去操作。

git stash # 暂时保存工作区的内容,注意:要保存dev2的内容,HEAD就要在dev2上

在这里插入图片描述
其实是保存到这里来了。

注意:git stash命令只能暂存已经被git管理的文件,因为README.md已经被git管理了,所以可以用git stash暂存。但是如果你说现在touch一个new_filegit stash去暂存是不行的。

此时我们就要checkoutmaster上去处理bug了。

然后创建一个bug分支。
在这里插入图片描述
然后去修复bug。
在这里插入图片描述

此时的状态就是,在fix_bug分支上,bug已经被修复了,master上还是bug,然后dev2在做某项开发。

此时就要让master上的bug也被修复,就是合并一下fix_bug分支。

在这里插入图片描述
此时我们的bug修复完了

此时我们要切回dev2分支继续进行开发。

此时我们工作区的内容在stash里面,所以先把stash的东西放出来先。

git stash list # 这个命令可以显示stash里面有哪些内容
git stash pop # 把stash里面的内容放出来,恢复到工作区中

在这里插入图片描述
但是此时dev2分支还是处于一个bug未修复的状态的,不过没关系,master已经修复了。

继续对dev2进行开发。
在这里插入图片描述
提交一下。
在这里插入图片描述
此时仓库的状态是这样的。
在这里插入图片描述
此时如果合并,可能会出现问题。
在这里插入图片描述
如果我们合并,我们就要手动解决冲突,如果手动改代码,就有可能会改出master的bug,怎么办?

所以此时我们一般这么办。

  1. dev2去合并master,而不是master合并dev2,然后在本地测试dev2,把所有问题排除。
  2. 然后让master去合并dev2,此时这次合并就不需要解决冲突了!
    在这里插入图片描述
    在这里插入图片描述
    这种处理方式,才是正确的处理方式!

我们现在就来模拟这个过程。

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

这个就是整套流程!

这就是工作中开发中比较好的流程!

强制删除分支

设想开发中的一个场景:

产品经理:你给我新增一个功能

我:好。我现在开始做

然后我就拉了一个dev分支开始做这个功能

开发到一半

产品经理:算了,这个功能取消了。

我:… 好的。

那我就只能删除这个dev分支。

我们之前学的git branch -d 是merge之后删,git是允许我们删的。

但是现在我在dev分支上做了若干commit了,git是会保护我们的分支的,不让删。

此时要用强制删除命令:

git branch -D dev # 把-d改成-D就是强制删除,当然还是要记得切到master上才能删dev

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

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

相关文章

10.Oracle中decode函数

【函数格式】&#xff1a; decode ( expression, condition_01, result_01, condition_02, result_02, ......, condition_n, result_n, result_default) 【函数说明】&#xff1a; 若表达式expression值与condition_01值匹配&#xff0c;则返回result_01&#xff0c;…

CPU深度解析

操作系统课程 计算机组成 ALU:计算单元(运算器)PC:pc寄存器存执行指令Registers:寄存器存数据MMU:控制器程序的构成:指令+数据 总线:一个程序读入内存,全是由0和1构成,从内存读取到cpu计算,需要通过总线。一段01数据段是指令还是数据是通过来源总线区分的。总线分…

flutter和原生利用pigeon建立通道

首先导入依赖&#xff1a; dependencies: pigeon: ^10.0.0定义一个文件&#xff1a; /// 用于定于flutter和平台的桥接方法 /// HostApi() 标记的&#xff0c;是用于 Flutter 调用原生的方法&#xff1b; /// FlutterApi() 标记的&#xff0c;是用于原生调用 Flutter 的方法&…

Netty入门学习和技术实践

Netty入门学习和技术实践 Netty1.Netty简介2.IO模型3.Netty框架介绍4. Netty实战项目学习5. Netty实际应用场景6.扩展 Netty 1.Netty简介 Netty是由JBOSS提供的一个java开源框架&#xff0c;现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具&…

高精度地图定位在高速公路自动驾驶系统中的应用

近年来随着汽车保有量不断增加&#xff0c;随之而来的是: ( 1) 严重的交通拥堵&#xff0c;通行效率低下&#xff0c;用在通行上的时间不断增加; ( 2) 交通事故频发&#xff0c;交通事故导致的伤亡人数和费用不断增加&#xff0c;而且绝大多数事故是由人为因素导致的; ( 3) 大气…

Linux:Nginx服务与搭建

目录 一、Nginx概述 二、Nginx三大作用&#xff1a;反向代理、负载均衡、动静分离 三、Nginx和Apache 3.1Nginx和Apache的差异 3.2Nginx和Apache的优缺点比较 四、编译安装niginx 五、创建Nginx 自启动文件 六、Nginx的信号使用 6.1信号 七、升级 nginx1.18 nginx1.2…

企业展示小程序的制作流程及关键步骤详解

在移动互联网时代&#xff0c;企业展示小程序已成为各个行业推广和展示的重要工具。搭建一个企业展示小程序不仅能够提高企业形象&#xff0c;还能够增加用户粘性和提升用户体验。下面我们来看一下如何从零基础搭建一个企业展示小程序&#xff0c;并顺利上线。 第一步&#xff…

2023.8 - java - 多态

多态是同一个行为具有多个不同表现形式或形态的能力。 多态就是同一个接口&#xff0c;使用不同的实例而执行不同操作&#xff0c; 多态的优点 1. 可替换性2 可扩充性3. 接口性、灵活性、简化性4. 消除类型之间的耦合关系 多态存在的三个必要条件 继承重写父类引用指向子类…

【负载均衡】Nacos简单入门

Nacos简单入门 快速安装 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nacos服务端或者源代码&#xff1a; 下载完压缩包之后&#xff0c;放在任意目录下面进行解压&#xff1a; GitHub主页&#xff1a;https://github.com/alibaba/nacos G…

机器学习策略——优化深度学习系统

正交化&#xff08;Orthogonalization&#xff09; 老式电视机&#xff0c;有很多旋钮可以用来调整图像的各种性质&#xff0c;对于这些旧式电视&#xff0c;可能有一个旋钮用来调图像垂直方向的高度&#xff0c;另外有一个旋钮用来调图像宽度&#xff0c;也许还有一个旋钮用来…

AIGC ChatGPT 按年份进行动态选择的动态图表

动态可视化分析的好处与优势&#xff1a; 1. 提高信息理解性&#xff1a;可视化分析使得大量复杂的数据变得易于理解&#xff0c;通过图表、颜色、形状、尺寸等方式&#xff0c;能够直观地表现不同的数据关系和模式。 2. 加快决策速度&#xff1a;数据可视化可以帮助用户更快…

RV64函数调用流程分析

RV64函数调用流程分析 1 RV64 函数调用实例2 对应代码的分析2.1 main函数及其对应的汇编程序2.1.1 main的C代码实现2.1.2 main函数对应汇编及其分析2.1.3 执行完成之后栈的存放情况 2.2 test_fun_a函数及其对应的汇编程序2.2.1 test_fun_a函数的C实现2.2.2 test_fun_a函数对应汇…

Flask狼书笔记 | 04_表单

文章目录 4 表单4.1 HTML表单4.2 使用Flask-WTF4.3 处理表单数据4.4 表单进阶实践小记 4 表单 表单是和用户交互最常见的方式之一&#xff0c;本章涉及的Python包由WTForms、Flask-WTF、Flask-CKEditor。&#xff08;p104&#xff09; 4.1 HTML表单 通过<form>标签创建…

2023国赛数学建模E题思路模型代码 高教社杯

本次比赛我们将会全程更新思路模型及代码&#xff0c;大家查看文末名片获取 之前国赛相关的资料和助攻可以查看 2022数学建模国赛C题思路分析_2022国赛c题matlab_UST数模社_的博客-CSDN博客 2022国赛数学建模A题B题C题D题资料思路汇总 高教社杯_2022国赛c题matlab_UST数模社…

【C/C++】父类指针指向子类对象 | 隐藏

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

ICCV 2023 Oral | 从无约束图像集合中生成新视角的交叉光线神经辐射场

文章链接&#xff1a;https://arxiv.org/abs/2307.08093 代码链接&#xff1a;https://github.com/YifYang993/CR-NeRF-PyTorch.git 01. 介绍 本工作旨在通过从不受限制的图像集合&#xff08;例如从互联网中爬取的图像&#xff09;中合成新视角图片&#xff0c;从而提供3D沉浸…

5.网络原理之初识

文章目录 1.网络发展史1.1独立模式1.2网络互连1.3局域网LAN1.3.1基于网线直连1.3.2基于集线器组建1.3.3基于交换机组建1.3.4基于交换机和路由器组建1.3.4.1路由器和交换机区别 1.4广域网WAN 2.网络通信基础2.1IP地址2.2端口号2.3认识协议2.4五元组2.5 协议分层2.5.1 分层的作用…

DTC状态变化例子 4

例子1&#xff1a; 此示例概述了两个操作周期排放相关的 OBD DTC 中 DTC 状态位的操作。该图显示了两个操作周期排放相关的 OBD DTC 的处理。该处理也可应用于非排放相关的 OBD DTC&#xff0c;此处显示仅供一般参考。 0 接收到清除诊断信息 → DTC 状态字节初始化。 1, 2 相关…

(动态规划) 剑指 Offer 48. 最长不含重复字符的子字符串 ——【Leetcode每日一题】

❓剑指 Offer 48. 最长不含重复字符的子字符串 难度&#xff1a;中等 请从字符串中找出一个最长的不包含重复字符的子字符串&#xff0c;计算该最长子字符串的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为…