【Git原理与使用】分支管理
分支管理
- 1.理解分支
- 2.创建分支
- 2.1创建分支
- 2.2切换分支
- 2.3合并分支
- 3.删除分支
- 4.合并冲突
- 4.分支管理策略
- 5.分支策略
- 6.bug分支
- 7.删除临时分支
- 8.小结
点赞👍👍收藏🌟🌟关注💖💖
你的支持是对我最大的鼓励,我们一起努力吧!😃😃
1.理解分支
Git 的杀手级功能之一(注意是之一,也就是后面还有之二,之三……):分支。
先从小一个小故事理解分支。
比如你出生一个在武侠村,这个武侠村现在要召开一个武林大会,凡是赢得人可以赢取村长女儿。现在距离无论武林大会还有三个月的时间。第一个月你先练基本功,第二个月和第三个月学习降龙十八掌,然后到时间参加比较。你可以做这些事情你的对手也可以做这些事情。如果你们学习能力差不多,天赋差不多,比赛你俩就五五开了。但是你有一个先天优势,你会分身术。在练习完基本功之后你创造了一个分身,这个分身去学习辟邪剑法,最后在比赛之前你让自己本体和分身进行一个合体,合体之后你就同时掌握了两门功法,所以参加比赛后你就把对手打得落花流水,最后赢得比赛之后赢取村长女儿。
其实Git也可以做到这一套,它也可以分身,也可以合体。
在之前说的版本库中有一个HEAD指针,它默认指向master分支。master里面其实存储的就是最近一个提交。
因此我们也可以串一条提交时间线出来,这个提交时间线我们可以称为主线,这主线就是 master主分支。
我们也可以在主分支上创建一个分支,然后合并分支。
2.创建分支
查看本地仓库的分支:
git branch
创建本地仓库的时候Git就会为我们自动创建master主分支
master 前面的 *,之前我们只知道HEAD指向master有这一个东西存在,但是对于HEAD指针我们并不了解它有什么功能。首先要明确HEAD不仅可以指向master分支,它也可以指向其他分支,被HEAD指向的分支就是当前正在工作的分支。
这里我们就知道为什么 * 在master前面,因为我们当前在master分支下工作。
2.1创建分支
git branch [分支名]
可以看到当前除了master分支,还有dev分支,当前HEAD还是指向master
并且我们可以看到,刚创建出来的dev分支和master主分支存放的最新提交的commit id是一样的。
我们创建新的分支是站在当前最新版本上创建的分支,所以dev分支指向了最新的提交
那如何切换到dev分支工作呢?
就是把HEAD指向dev,让dev成为当前工作的分支。
2.2切换分支
git checkout [分支名]
接下来我们就可以在dev分支进行工作了,我们进行一次提交
然后我们在切回master分支,然后打印ReadMe文件,发现新增的代码不见了。
我们在切回dev分支,发现这一行代码还在
我们查看到dev分支目前最新提交的commit id,打印一下发现它前一个commit id正好是我们刚创建dev里面的conmit id也是master最新提交的commit id。这是因为我们在这个提交线上又进行了一次提交。dev指向了最新的一次提交,而master没动。
那我们想在master分支下看到这一行代码怎么做呢?那就要将master分支和dev分支进行一次合并操作。
2.3合并分支
如果我们想要master分支合并dev分支,我们必须要先切到master分支,然后在合并。
git merge [分支名]
Fast-forward表示快进模式,下面在解释。然后还打印初ReadMe改变,一行插入。
现在打印ReadMe就可以在master分支上看到新增的一行代码。
合并后master分支和dev分支一样指向最新提交的commit id
Fast-forward快进模式,表示直接把master指向dev最新提交的commit id。所有看到合并是非常快的。
3.删除分支
目前我们已经成功创建了属于自己的本地分支并且完成了自己的工作,那么对于dev分支来说它的工作已经完成了,那dev分支就没有用了,我们如何将它删除呢?
但是要注意的是我们只能在其他的分支上才能删除你要删除的分支!
git branch -d [分支名]
因为创建、合并和删除分支非常快,所以Git鼓励你使用分只完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。
4.合并冲突
在实际分支合并的时候,并不是想合并就能合并成功的,有时候可能会遇到代码冲突的问题。
比如说dev1分支和master分支都对当前ReadMe文件的一行代码进行了修改,此时就有合并冲突的问题。Git并不知道此时需要保留bbb还是ccc的代码,这都是开发人员自己写的是由开发人员自己决定的,所以就有合并冲突的问题。
这里我们在学一个命令,直接一条命令完成 ,创建 + 切换分支
git checkout -b [分支]
创建dev1分支,修改ReadMe文件aaa变成bbb,然后提交
切换到master分支,也去修改ReadMe文件aaa变成ccc,然后提交
下面是此时的仓库状态
然后我们让master合并dev分支,就会发生冲突。
合并ReadMe文件冲突,我们需要手动解决冲突然后将结果在进行提交。
进入ReadMe文件发现 <<<<< Head ====== >>>>> dev1,< 到 = 之间的代码是由当前master分支上的代码,= 到 > 是dev1分支上的代码。在 < 到 > 是冲突代码,表示bbb和ccc冲突了。Git没办法帮我们解决冲突,需要我们手动解决冲突,到底是保留bbb还是ccc,还是都保留,还是都删除,这都是由开发人员自己判断。
比如我们现在保留bbb代码,只需要把< 到 > 其他代码删掉即可。现在就不冲突了。然后将结果重新提交。
合并冲突之后,需要手动调整冲突代码,并需要再次提交修正后的结果!!(再次提交很重要,切勿忘记)
用带参数的 git log也可以看到分支的合并情况
git log --graph --pretty=oneline --abbrev-commit
4.分支管理策略
到目前为止,我们已经使用过两次merge操作,一次是直接合并没有发生冲突,一次合并发生冲突解决冲突后在重新提交。 对于这两次merge操作其实分别对应了Git提供给我们两个merge模式。
通常合并分支时,如果可能,Git 会采用 Fast forward 模式。
可以清楚看到使用Fast - forward 快进模式 ,在这种 Fast forward 模式下,删除分支后,查看分支历史时,会丢掉分支信息,看不出来最新提交到底是 merge 进来的还是正常提交的。
但在合并冲突部分,我们也看到通过解决冲突问题,会再进行一次新的提交,得到的最终状态为:
那么这就不是 Fast forward 模式了,这样的好处是,从分支历史上就可以看出分支信息。例如我们现在已经删除了在合并冲突部分创建的 dev1 分支,但依旧能看到 master 其实是由其他分支合并得到:
Git 支持我们强制禁用 Fast forward 模式,那么就会在 merge 时生成⼀个新的 commit ,这样,从分支历史上就可以看出分⽀信息。
git merge --no-ff -m "xxxx" [分支]
可以看到,不使用 Fast forward 模式,merge后就像下面这样,所以在合并分支时,加上 --no-ff 参数就可以用普通模式合并,合并后的历史有分支,能看出来曾
经做过合并,而 fast forward 合并就看不出来曾经做过合并。
合并我们建议不要使用Fast-forward,而使用no-ff。
5.分支策略
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
6.bug分支
假如我们现在正在 dev2 分支上进行开发,开发到一半,突然发现 master 分支上面有 bug,需要解决。注意不能在master主分支上进行代码修复,我们需要在本地创建一个专门修复master主分支上的bug,修复后,合并分支,然后将临时分支删除。如果在master主分支上进行代码修复,可能会造成一个更大的bug。
可现在 dev2 的代码在工作区中开发了一半,还无法提交,怎么办?
Git 提供了 git stash 命令,可以将当前的工作区信息进行储藏,被储藏的内容可以在将来某个时间恢复出来。
git stash
stash在refs下,注意stash里面存的是已经被Git追踪管理的文件,ReadMe已经被追踪管理了,所以对工作区ReadMe文件修改它是可以保存起来的。
接下来我们创建一个bug分支,对master出现的bug进行修复。
比如说ReadMe文件123后面少跟了456导致bug,现在我们加上,bug修完之后进行提交合并。
修复完bug之后,由于我们还在dev2下进行开发,所以还要在进行开发。但是发现开发的内容不见了,原因是因为修复bug之前把dev2开发的内容存储到stash里面了。
我们要重新开发,就要把存到stash里面的内容恢复过来。我们可以使用 git stash pop 命令,恢复的同时会把 stash 也删了。
git stash pop
不过恢复之前我们还可以查看一下stash里面存了那些东西
git stash list
目前我们看到确实是恢复过来了。但是123后面并没有跟456,也就是dev2这里并没有修复bug,原因是因为我们在创建dev2的时候是基于master的有bug的时候,所以dev2还是未修复bug的状态。不过它并不影响master主分支。
我们看此时仓库的状态就能明白刚才说的这一点,master 分支前最新的提交,是要领先于新建 dev2 时基于的 master 分支的提交的,所以我们在 dev2 中当然看不见修复 bug 的相关代码。
当dev2继续开发完成后,就可以在dev2分支上提交了
我们的最终目的是要让 master 合并 dev2 分支的,那么正常情况下我们切回 master 分支直接合并即可,但这样其实是有一定风险的。
是因为在合并分支时可能会有冲突,而代码冲突需要我们手动解决(在 master 上解决)。我们无法保证对于冲突问题可以正确地一次性解决掉,因为在实际的项目中,代码冲突不只一两行那么简单,有可能几十上百行,甚至更多,解决的过程中难免手误出错,导致错误的代码被合并到 master 上。此时的状态为:
解决这个问题的一个好的建议就是:最好在自己的分支上合并下 master ,再让 master 去合并dev ,这样做的目的是有冲突可以在本地分支解决并进行测试,而不影响 master 。此时的状态为:
一般我们让master合并自己的代码之前,都建议这样做。
7.删除临时分支
软件开发中,总有无穷无尽的新的功能要不断添加进来。
添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个分支,我们可以将其称之为 feature 分支,在上面开发,完成后,合并,最后,删除该 feature 分支。
可是,如果我们今天正在某个 feature 分支上开发了一半,被产品经理突然叫停,说是要停止新功能的开发。虽然白干了,但是这个 feature 分支还是必须就地销毁,留着无用了。这时使用传统的 git branch -d 命令删除分支的方法是不行的,因为它只适用于删除已经merge过的分支。对于没有merge过的分支要使用git branch -D 去删除。
git branch -D [分支]
8.小结
分支在实际中有什么⽤呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了⼀个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
并且 Git 无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。
相关文章:

【Git原理与使用】分支管理
分支管理 1.理解分支2.创建分支2.1创建分支2.2切换分支2.3合并分支 3.删除分支4.合并冲突4.分支管理策略5.分支策略6.bug分支7.删除临时分支8.小结 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励&…...

Linux操作系统分析实验-多线程与内核模块编程,实验一
实验一 多线程与内核模块编程 一、实验目的 1、理解Linux下进程的结构; 2、理解Linux下产生新进程的方法(系统调用—fork函数); 3、掌握如何启动另一程序的执行; 4、理解Linux下线程的结构; 5、理解…...

AI绘画Stable Diffusion人物背景替换实操教程,让创意无限延伸
大家好,我是灵魂画师向阳 Stable Diffusion以其强大的能力可以实现人物背景的更换。本文将带你深入了解如何利用Stable Diffusion中的Inpaint Anything插件快速且精准地实现人物背景的替换,从而让你的图片焕发新生。 前期准备 本文会使用到Inpaint An…...

linux环境oracle11.2.0.4打补丁(p31537677_112040_Linux-x86-64.zip)
上传补丁及opatch工具 创建目录并上传opatch工具和补丁包 百度网盘地址 链接: https://pan.baidu.com/s/1EA5oerm52aesZUnb5OnQsA 提取码: ib8f [oraclerhel64 ~]$ mkdir /u01/psu [oraclerhel64 ~]$ cd /u01/psu [oraclerhel64 psu]$ ll total 514572 -rw-r--r-- 1 oracle o…...

华为 HCIP-Datacom H12-821 题库 (29)
🐣博客最下方微信公众号回复题库,领取题库和教学资源 🐤诚挚欢迎IT交流有兴趣的公众号回复交流群 🦘公众号会持续更新网络小知识😼 1.运行 IS-IS 的两台路由器,只有 IIH 发送的时间间隔相同才可以建立邻接关系 A、正…...
MySQL 为什么一定要有一个主键
引言 在数据库设计中,主键(Primary Key)是一个至关重要的概念。MySQL 作为最广泛使用的关系型数据库之一,主键在 MySQL 表设计中扮演着关键角色。主键不仅决定了表中数据的唯一性和完整性,还对数据库性能、数据查询、…...

Pycharm 本地搭建 stable-diffusion-webui
一、下载工程源码 Github官方连接 https://github.com/AUTOMATIC1111/stable-diffusion-webui 二、Pycharm打开工程 1、设置环境 文件-设置-项目-Python解析器-添加解释器-添加本地解释器 Conda环境-创造新环境-Python版本3.10 注意一定要选择Python3.10版本,否…...
python/爬虫技术/lxml工具介绍/XML和HTML解析
1.lxml介绍: lxml 是一个Python库,它提供了非常强大的XML和HTML解析功能。它基于libxml2和libxslt,是处理XML和HTML文档的首选库之一。 2.安装 首先,需要安装lxml库。可以通过pip来安装,在控制台内执行安装命令。 p…...
Kafka技术详解[5]: 集群启动
目录 集群启动 相关概念 代理:Broker 控制器:Controller 启动ZooKeeper 启动Kafka 初始化ZooKeeper 初始化服务 启动任务调度器 创建数据管理器 创建远程数据管理器 创建副本管理器 创建ZK元数据缓存 创建Broker通信对象 创建网络通信对象 注册Brok…...

记一次教学版内网渗透流程
信息收集 如果觉得文章写的不错可以共同交流 http://aertyxqdp1.target.yijinglab.com/dirsearch dirsearch -u "http://aertyxqdp1.target.yijinglab.com/"发现 http://aertyxqdp1.target.yijinglab.com/joomla/http://aertyxqdp1.target.yijinglab.com/phpMyA…...

[Python学习日记-31] Python 中的函数
[Python学习日记-31] Python 中的函数 简介 语法定义 函数的参数 简介 引子: 你是某公司的一个高级程序员,现在老板让你写一个监控程序,需要24小时全年无休的监控公司网站服务器的系统状况,当 CPU、Memory、Disk 等指标的使用…...

Kafak入门技术详解
抱歉,没有太多的时间进行详细校对 目录 一、Kafka简介 1.消息队列 1.1为什么需要消息队列 1.2消息队列 1.3消息队列的分类 1.4P2P和发布订阅MQ的比较 1.5消息系统的使用场景 1.6常见的消息系统 2.Kafka简介 2.1简介 2.2设计目标 2.3 kafka核心的概念 二…...
X-Spreadsheet:Web端Excel电子表格工具库
在数字化时代,数据管理与分析的重要性日益凸显。传统的电子表格软件如Microsoft Excel和Google Sheets在数据处理方面发挥着重要作用,但在Web端,一款名为X-Spreadsheet的工具库正以其独特的优势逐渐崭露头角。本文将详细介绍X-Spreadsheet&am…...

为什么很多APP取消网页版
厂商为了增加用户黏度把所有的内容都放在 APP 上,京东的网页也搜索不到东西了,就算看到东西要跳转过来还需要先登录一下。 对比亚马逊这类的其他的购物网站,基本上都是网页内容和 APP 的内容都是同步的,网页直接看也可以下单&…...

Kubernetes高级功能
资源配额 什么是资源配额 资源配额,通过 ResourceQuota 对象来定义,对每个命名空间的资源消耗总量提供限制。 它可以限制命名空间中某种类型的对象的总数目上限,也可以限制命名空间中的 Pod 可以使用的计算资源的总上限。 资源配额应用 创建的…...

(作业)第三期书生·浦语大模型实战营(十一卷王场)--书生入门岛通关第1关Linux 基础知识
关卡任务 闯关任务需要在关键步骤中截图: 任务描述 完成所需时间 闯关任务 完成SSH连接与端口映射并运行hello_world.py 10min 可选任务 1 将Linux基础命令在开发机上完成一遍 10min 可选任务 2 使用 VSCODE 远程连接开发机并创建一个conda环境 10min 可选任务 3 创…...
【python爬取网页信息并存储】
爬取网页信息并存储是一个常见的任务,通常涉及以下几个步骤: 发送HTTP请求:使用库如requests来发送HTTP请求获取网页内容。解析网页内容:使用库如BeautifulSoup或lxml来解析HTML内容,提取所需信息。存储数据ÿ…...

TCP、UDP
TCP和UDP的区别 是否面向连接:UDP 在传送数据之前不需要先建立连接。而 TCP 提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。 是否是可靠传输:远地主机在收到 UDP 报文后,不需要给出任…...

聊聊暖通空调系统的优化控制方法
目录 暖通空调系统的优化控制方法✈️part1 初版回归网络建模✈️part2 更新的回归网络✈️ 聊聊暖通空调系统的优化控制方法 这篇文章简单分享一下暖通空调(HVAC)领域常常提到的”优化控制“这一概念指的是什么,它控制的是哪些参数&#…...
2024年合肥市职业院校技能大赛(中职组)赛 网络安任务书样题
2024年合肥市职业院校技能大赛--中职组赛 网络安任务书样题 一、竞赛项目简介:二、竞赛注意事项模块A: 理论技能与职业素养模块B: 网络安全事件响应、数字取证调查和应用安全任务一:应急响应任务二:操作系统取证任务三:网络数据包分析任务四:代码审计 模块C:CTF 夺旗…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...