当前位置: 首页 > news >正文

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

相关文章:

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

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…...

【VsCode】SSH远程连接Linux服务器开发,搭配cpolar内网穿透实现公网访问(1)

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…...

LC-1267. 统计参与通信的服务器(枚举 + 计数)

1267. 统计参与通信的服务器 中等 这里有一幅服务器分布图&#xff0c;服务器的位置标识在 m * n 的整数矩阵网格 grid 中&#xff0c;1 表示单元格上有服务器&#xff0c;0 表示没有。 如果两台服务器位于同一行或者同一列&#xff0c;我们就认为它们之间可以进行通信。 请…...

Linux TCP协议——三次握手,四次挥手

一、TCP协议介绍 TCP协议是可靠的、面向连接的、基于字节流的传输层通信协议。 TCP的头部结构&#xff1a; 源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去;&#xff08;tcp是传输层的协议&#xff0c;端与端之间的数据传输&#xff0c;在TCP和UDP协议当中不会体现出I…...

人机对抗智能-部分可观测异步智能体协同(POAC)

环境链接&#xff1a;数据中心-人机对抗智能 (ia.ac.cn)http://turingai.ia.ac.cn/data_center/show/10 1.环境配置 Ubuntu 20.04 Anaconda python版本3.6 1.1 安装torch0.4.1失败 参考文章&#xff1a; 安装torch0.4.1的神坑_torch0.4.1_DEMO_Tian的博客-CSDN博客 co…...

数学——七桥问题——图论

当涉及数学&#xff0c;有很多不同的话题可以讨论。你是否有特定的数学领域、概念或问题想要了解更多&#xff1f;以下是一些常见的数学领域和主题&#xff0c;你可以选择一个或者告诉我你感兴趣的具体内容&#xff0c;我将很乐意为你提供更多信息&#xff1a; 代数学&#xff…...

python 模块lxml 处理 XML 和 HTML 数据

xpath&#xff1a;https://blog.csdn.net/randy521520/article/details/132432903 一、安装 XPath (XML Path Language) 是一门在 HTML\XML 文档中查找信息的语言&#xff0c;可用来在 HTML\XML 文档中对元素和属性进行遍历。 pip install lxml二、使用案例 from lxml impo…...

SpringBoot 统⼀功能处理

统⼀功能处理 1. 拦截器2. 统⼀异常处理3. 统⼀数据返回格式 1. 拦截器 Spring 中提供了具体的实现拦截器&#xff1a;HandlerInterceptor&#xff0c;拦截器的实现分为以下两个步骤&#xff1a; 创建⾃定义拦截器&#xff0c;实现 HandlerInterceptor 接⼝的 preHandle&…...

hadoop 报错 java.io.IOException: Inconsistent checkpoint fields

背景: 使用了格式化,导致首重了新的集群ID org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /work1/home/hadoop/dfs/data/current/BP-1873526852-172.16.21.30-1692769875005 is in an inconsistent state: namespaceID is incompatible with …...

workbench连接MySQL8.0错误 bad conversion 外部组件 异常

阿里云搭建MySQL实用的版本是8.0 本地安装的版本是: workbench 6.3 需要升级到&#xff1a; workbench 8.0 https://dev.mysql.com/downloads/workbench/...

Qt Scroll Area控件设置,解决无法显示全部内容,且无法滚动显示问题。

前言&#xff0c;因为要显示很多条目的内容&#xff0c;原来是用Vertical Layout控件里面嵌套Horizontal layout显示了很多行控件&#xff0c;发现最简单的方法就是使用滚动条控件&#xff0c;但是无论如何调整需要滚动的控件高度&#xff0c;始终无法滚动显示内容。也就是说添…...

【Java架构-包管理工具】-Maven私服搭建-Nexus(三)

本文摘要 Maven作为Java后端使用频率非常高的一款依赖管理工具&#xff0c;在此咱们由浅入深&#xff0c;分三篇文章&#xff08;Maven基础、Maven进阶、私服搭建&#xff09;来深入学习Maven&#xff0c;此篇为开篇主要介绍Maven私服搭建-Nexus 文章目录 本文摘要1. Nexus安装…...

守护进程(精灵进程)

目录 前言 1.如何理解前台进程和后台进程 2.守护进程的概念 3.为什么会存在守护进程 4.如何实现守护进程 5.测试 总结 前言 今天我们要介绍的是关于守护进程如何实现&#xff0c;可能有小伙伴第一次听到守护进程这个概念&#xff0c;感觉很懵&#xff0c;知道进程的概念&…...

csdn冷知识:如何在csdn里输入公式或矩阵

目录 1 输入公式 2 输入矩阵 3 如何输入复杂公式 4 如何修改&#xff0c;已经生成的公式 1 输入公式 进入编辑模式点击右边的菜单&#xff1a;公式然后进入公式编辑器&#xff0c;选择右边的 ... 可以选择大括号等&#xff0c;右边还有矩阵符号选择后你需要创建几行几列的…...

【前端】CSS技巧与样式优化

目录 一、前言二、精灵图1、什么是精灵图2、为什么需要精灵图3、精灵图的使用①、创建CSS精灵图的步骤1&#xff09;、选择合适的图标2&#xff09;、合并图片3&#xff09;、设置背景定位 ②、优化CSS精灵图的技巧1&#xff09;、维护方便2&#xff09;、考虑Retina屏幕3&…...

Linux下的系统编程——makefile入门

前言&#xff1a; 或许很多Winodws的程序员都不知道这个东西&#xff0c;因为那些Windows的IDE都为你做了这个工作&#xff0c;但我觉得要作一个好的和professional的程序员&#xff0c;makefile还是要懂。这就好像现在有这么多的HTML的编辑器&#xff0c;但如果你想成为一个专…...

redis常用五种数据类型详解

目录 前言&#xff1a; string 相关命令 内部编码 应用场景 hash 相关命令 内部编码 应用场景 list 相关命令 内部编码 应用场景 set 相关命令 内部编码 应用场景 Zset 相关命令 内部编码 应用场景 渐进式遍历 前言&#xff1a; redis有多种数据类型&…...

Python代理池健壮性测试 - 压力测试和异常处理

大家好&#xff01;在构建一个可靠的Python代理池时&#xff0c;除了实现基本功能外&#xff0c;我们还需要进行一系列健壮性测试来确保其能够稳定运行&#xff0c;并具备应对各种异常情况的能力。本文将介绍如何使用压力测试工具以及合适的异常处理机制来提升Python代理池的可…...

回文子串-中心拓展

给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被视作不…...

2023.8各大浏览器11家对比:Edge/Chrome/Opera/Firefox/Tor/Vivaldi/Brave,安全性,速度,体积,内存占用

测试环境&#xff1a;全默认设置的情况下&#xff0c;均在全新的系统上进行测试&#xff0c;系统并未进行任何改动&#xff0c;没有杀毒软件&#xff0c;浏览器进程全部在后台&#xff0c;且为小窗模式&#xff0c;小窗分辨率均为浏览器厂商默认缩放大小(变量不唯一)&#xff0…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

32位寻址与64位寻址

32位寻址与64位寻址 32位寻址是什么&#xff1f; 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元&#xff08;地址&#xff09;&#xff0c;其核心含义与能力如下&#xff1a; 1. 核心定义 地址位宽&#xff1a;CPU或内存控制器用32位…...

Linux操作系统共享Windows操作系统的文件

目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项&#xff0c;设置文件夹共享为总是启用&#xff0c;点击添加&#xff0c;可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download&#xff08;这是我共享的文件夹&#xff09;&…...