Git企业开发控制理论和实操-从入门到深入(三)|分支管理
前言
那么这里博主先安利一些干货满满的专栏了!
首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。
- 高质量博客汇总
然后就是博主最近最花时间的一个专栏《Git企业开发控制理论和实操》希望大家多多关注!
- Git企业开发控制理论和实操
Git的分支管理
我们继续在上一章创建的本地仓库中继续进行分支的学习。
分支创建、切换、合并的简单尝试
git branch # 查看本地有哪些分支
前面的*
是什么?
我们前面说到,HEAD
一开始是指向master
的,但HEAD
不是只能指向master
的,而是可以指向其他分支。
然后被HEAD
指向的分支才是工作分支。
如何创建一个本地的分支呢?
git branch dev # 创建一个名为dev的分支
发现多了一个dev
但此时HEAD
还是指向master
的。我们打印一下HEAD
就能看到。
同样,tree
一下.git/
也可以看到新建的dev
此时我们可以把dev
和master
的内容都打印一下。
我们知道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中,注意表达和顺序,是反过来是不一样的。
首先先要checkout
到master
上来。
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
那一行,直接删掉其他代码就行了。
重新提交后即可,此时仓库的状态是这样的。
- 注意:因为是
master
去merge
了dev
,所以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_file
让git stash
去暂存是不行的。
此时我们就要checkout
到master
上去处理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,怎么办?
所以此时我们一般这么办。
- 让
dev2
去合并master
,而不是master
合并dev2
,然后在本地测试dev2
,把所有问题排除。 - 然后让
master
去合并dev2
,此时这次合并就不需要解决冲突了!
这种处理方式,才是正确的处理方式!
我们现在就来模拟这个过程。
这个就是整套流程!
这就是工作中开发中比较好的流程!
强制删除分支
设想开发中的一个场景:
产品经理:你给我新增一个功能
我:好。我现在开始做
然后我就拉了一个dev分支开始做这个功能
开发到一半
产品经理:算了,这个功能取消了。
我:… 好的。
那我就只能删除这个dev
分支。
我们之前学的git branch -d
是merge之后删,git是允许我们删的。
但是现在我在dev
分支上做了若干commit
了,git是会保护我们的分支的,不让删。
此时要用强制删除命令:
git branch -D dev # 把-d改成-D就是强制删除,当然还是要记得切到master上才能删dev
相关文章:
Git企业开发控制理论和实操-从入门到深入(三)|分支管理
前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…...
【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. 统计参与通信的服务器 中等 这里有一幅服务器分布图,服务器的位置标识在 m * n 的整数矩阵网格 grid 中,1 表示单元格上有服务器,0 表示没有。 如果两台服务器位于同一行或者同一列,我们就认为它们之间可以进行通信。 请…...
Linux TCP协议——三次握手,四次挥手
一、TCP协议介绍 TCP协议是可靠的、面向连接的、基于字节流的传输层通信协议。 TCP的头部结构: 源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去;(tcp是传输层的协议,端与端之间的数据传输,在TCP和UDP协议当中不会体现出I…...
人机对抗智能-部分可观测异步智能体协同(POAC)
环境链接:数据中心-人机对抗智能 (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失败 参考文章: 安装torch0.4.1的神坑_torch0.4.1_DEMO_Tian的博客-CSDN博客 co…...
数学——七桥问题——图论
当涉及数学,有很多不同的话题可以讨论。你是否有特定的数学领域、概念或问题想要了解更多?以下是一些常见的数学领域和主题,你可以选择一个或者告诉我你感兴趣的具体内容,我将很乐意为你提供更多信息: 代数学ÿ…...
python 模块lxml 处理 XML 和 HTML 数据
xpath:https://blog.csdn.net/randy521520/article/details/132432903 一、安装 XPath (XML Path Language) 是一门在 HTML\XML 文档中查找信息的语言,可用来在 HTML\XML 文档中对元素和属性进行遍历。 pip install lxml二、使用案例 from lxml impo…...
SpringBoot 统⼀功能处理
统⼀功能处理 1. 拦截器2. 统⼀异常处理3. 统⼀数据返回格式 1. 拦截器 Spring 中提供了具体的实现拦截器:HandlerInterceptor,拦截器的实现分为以下两个步骤: 创建⾃定义拦截器,实现 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 需要升级到: workbench 8.0 https://dev.mysql.com/downloads/workbench/...
Qt Scroll Area控件设置,解决无法显示全部内容,且无法滚动显示问题。
前言,因为要显示很多条目的内容,原来是用Vertical Layout控件里面嵌套Horizontal layout显示了很多行控件,发现最简单的方法就是使用滚动条控件,但是无论如何调整需要滚动的控件高度,始终无法滚动显示内容。也就是说添…...
【Java架构-包管理工具】-Maven私服搭建-Nexus(三)
本文摘要 Maven作为Java后端使用频率非常高的一款依赖管理工具,在此咱们由浅入深,分三篇文章(Maven基础、Maven进阶、私服搭建)来深入学习Maven,此篇为开篇主要介绍Maven私服搭建-Nexus 文章目录 本文摘要1. Nexus安装…...
守护进程(精灵进程)
目录 前言 1.如何理解前台进程和后台进程 2.守护进程的概念 3.为什么会存在守护进程 4.如何实现守护进程 5.测试 总结 前言 今天我们要介绍的是关于守护进程如何实现,可能有小伙伴第一次听到守护进程这个概念,感觉很懵,知道进程的概念&…...
csdn冷知识:如何在csdn里输入公式或矩阵
目录 1 输入公式 2 输入矩阵 3 如何输入复杂公式 4 如何修改,已经生成的公式 1 输入公式 进入编辑模式点击右边的菜单:公式然后进入公式编辑器,选择右边的 ... 可以选择大括号等,右边还有矩阵符号选择后你需要创建几行几列的…...
【前端】CSS技巧与样式优化
目录 一、前言二、精灵图1、什么是精灵图2、为什么需要精灵图3、精灵图的使用①、创建CSS精灵图的步骤1)、选择合适的图标2)、合并图片3)、设置背景定位 ②、优化CSS精灵图的技巧1)、维护方便2)、考虑Retina屏幕3&…...
Linux下的系统编程——makefile入门
前言: 或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专…...
redis常用五种数据类型详解
目录 前言: string 相关命令 内部编码 应用场景 hash 相关命令 内部编码 应用场景 list 相关命令 内部编码 应用场景 set 相关命令 内部编码 应用场景 Zset 相关命令 内部编码 应用场景 渐进式遍历 前言: redis有多种数据类型&…...
Python代理池健壮性测试 - 压力测试和异常处理
大家好!在构建一个可靠的Python代理池时,除了实现基本功能外,我们还需要进行一系列健壮性测试来确保其能够稳定运行,并具备应对各种异常情况的能力。本文将介绍如何使用压力测试工具以及合适的异常处理机制来提升Python代理池的可…...
回文子串-中心拓展
给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不…...
2023.8各大浏览器11家对比:Edge/Chrome/Opera/Firefox/Tor/Vivaldi/Brave,安全性,速度,体积,内存占用
测试环境:全默认设置的情况下,均在全新的系统上进行测试,系统并未进行任何改动,没有杀毒软件,浏览器进程全部在后台,且为小窗模式,小窗分辨率均为浏览器厂商默认缩放大小(变量不唯一)࿰…...
python中的matplotlib画散点图(数据分析与可视化)
python中的matplotlib画散点图(数据分析与可视化) import numpy as np import pandas as pd import matplotlib.pyplot as pltpd.set_option("max_columns",None) plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus]Fa…...
2023前端面试笔记 —— HTML5
系列文章目录 内容链接2023前端面试笔记HTML5 文章目录 系列文章目录前言一、HTML 文件中的 DOCTYPE 是什么作用二、HTML、XML、XHTML 之间有什么区别三、前缀为 data- 开头的元素属性是什么四、谈谈你对 HTML 语义化的理解五、HTML5 对比 HTML4 有哪些不同之处六、meta 标签有…...
【LeetCode】面试题总结 消失的数字 最小k个数
1.消失的数字 两种思路 1.先升序排序,再遍历并且让后一项与前一项比较 2.转化为数学问题求等差数列前n项和 (n的大小为数组的长度),将根据公式求得的应有的和数与数组中实际的和作差 import java.util.*; class Solution {public …...
导入功能importExcel (现成直接用)
1. 实体类字段上加 Excel(name "xxx"), 表示要导入的字段 Excel(name "用户名称")private String nickName; 2. controller (post请求) /*** 导入用户数据** param file 文件* param updateSupport 是否更新支持,如果已存在,则进…...
cvc-complex-type.2.4.a: 发现了以元素 ‘base-extension‘ 开头的无效内容。应以 ‘{layoutlib}‘ 之一开头
不能飞的猪只是没用的猪。 —— 宫崎骏 《红猪》 常见的1种case 记录一下,新电脑安装android studio导入公司那些gradle还是5.5左右的工程以后,各种不适应。编译问题出现了。老电脑都是好好的。 cvc-complex-type.2.4.a: 发现了以元素 ‘base-extensi…...
cortex-A7核IIC实验
iic.h: #ifndef __IIC_H__ #define __IIC_H__ #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h"/* 通过程序模拟实现I2C总线的时序和协议* GPIOF ---> AHB4* I2C1_SCL ---> PF14* I2C1_SDA ---> PF15** */#define SET_SDA_…...
task.run()和 await task.run() 区别 await 运行机制
Task.Run() 和 await Task.Run() 都涉及异步编程,但它们在使用场景和效果上有一些区别。1. **Task.Run():**- Task.Run() 是一个用于在后台线程上执行代码块的方法。它将指定的代码块包装在一个新的Task中,并在后台线程上运行。它不会阻塞调用…...
LeetCode面试经典150题(day 2)
26. 删除有序数组中的重复项 难度:简单 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯…...
阿里云机器学习PAI全新推出特征平台 (Feature Store),助力AI建模场景特征数据高效利用
推荐算法与系统在全球范围内已得到广泛应用,为用户提供了更个性化和智能化的产品推荐体验。在推荐系统领域,AI建模中特征数据的复用、一致性等问题严重影响了建模效率。阿里云机器学习平台 PAI 推出特征平台(PAI-FeatureStore) 。…...
网络安全工具和资源推荐: 介绍网络安全领域中常用的工具、框架、资源和学习资料
章节1: 前言 随着数字化时代的不断深入,网络安全的重要性愈发凸显。在这个信息爆炸的时代,我们必须保护个人隐私、敏感数据以及网络基础设施免受各种威胁。本文将为您介绍一些网络安全领域中常用的工具、框架、资源和学习资料,帮助您更好地入…...
wordpress显示doc/宁波核心关键词seo收费
我们用 *args当我们不确定将多少个参数传递给函数时,或者我们是否要将存储的列表或参数元组传递给函数时。 **kwargs当我们不知道将多少关键字参数传递给函数时,或者它可以用于将字典的值作为关键字参数传递时使用。...
建设单位网站需求报告/seo在线优化技术
127.0.0.1,特殊的环回地址,大多数系统把此IP地址分配给换回接口分配给这个接口,并命名为localhost(主机名),一般用来对运行在同一台主机上的程序通过TCP/IP进行通信。 0.0.0.0,特殊的源地址,表示的是网络上…...
免费网站可以做cpa?/百度免费推广登录入口
这题,通过多次试验,可以发现,当只存在两堆(以下称对)相等的石子时,先手必输。更进一步,当N对这样的石子存在时,先手必输。 于是,若1要赢,一种方法是ÿ…...
门店充值会员卡系统/搜索引擎优化简称seo
java安装改善我们编写的Java代码的一种方法是使用最好的工具。 因此,让我们看看IDR Solutions建议使用的5种最常用的工具来帮助Java开发人员编写更好的代码。 查找错误 FindBugs是一个开放源代码程序,根据Lesser GNU Public许可的条款进行分发࿰…...
网页建设/长沙seo优化价格
背景介绍 标注数据集对深度学习而言是很重要的一步,但是标注数据是一项枯燥乏味的工作,而重复劳动对人来说又是极痛苦的。在刚刚过去的第十七届全国大学生智能汽车竞赛中我们深有体会。为了减少工作量,笔者将半自动标注的方法运用于该比赛的…...
微信群投票网站怎么做/长沙网络科技有限公司
用来实现网页离线缓存(用于离线阅读)的方式比较多,比如: 1、利用html5的cache机制(但是网页cache有大小限制) 2、利用对html5做自定义解析,对dom树分析后请求并存储相关资源。 3、利用NSURLCach…...