【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 夺旗…...
制造企业如何提升项目管理效率?惠科股份选择奥博思PowerProject项目管理系统
全球知名的显示方案综合服务商 - 惠科股份有限公司与北京奥博思达成合作,基于奥博思 PowerProject 搭建企业级项目管理平台。满足惠科多产品多业务领域的项目全周期管理。助力企业在技术研发、产品创新等方面继续取得行业领先优势。 同时,PowerProject …...
mTLS(Mutual TLS)即双向传输层安全,是一种安全通信协议,用于在客户端和服务器之间建立双向的身份验证和加密通道。
mTLS(Mutual TLS)即双向传输层安全,是一种安全通信协议,用于在客户端和服务器之间建立双向的身份验证和加密通道。在传统的TLS(Transport Layer Security)中,客户端通常只会验证服务器的身份&am…...
HUAWEI WATCH GT 系列安装第三方应用
文章目录 适用机型概述官方文档从源码构建 hap 文件和对源码签名下载和安装DevEco Studio下载和安装首次启动推荐:设置IDE推荐的兼容版本环境(可选)安装并启用中文菜单插件 使用DevEco Studio打开项目并进行构建构建问题解决一、生成密钥和证…...
Html jquery下拉select美化插件——selectFilter.js
1. Html jquery下拉select美化插件——selectFilter.js jQuery是一个广泛使用的JavaScript库,它简化了DOM操作、事件处理、动画以及Ajax交互,使得开发者能更高效地构建交互式网页。在本案例中,jquery.selectlist.js插件正是基于jQuery构建的&…...
使用ESP8266扫描WiFi列表
一、简介 准备用基于esp8266的nodemcu开发板做一个天气时钟。目前只实现了第一阶段任务的第一点要求。使用arduino编程,在基于esp8266的nodemcu开发板上实现开机自动连接wifi。 这里记录一下使用ESP8266扫描WiFi列表的方法。还需要研究怎么把列表显示在网页上&…...
Java对象访问机制:句柄访问与直接指针访问
在Java虚拟机(JVM)中,对象的访问方式是一个关键的设计选择,它影响着程序的性能和内存管理。JVM规范中只规定了对象引用(reference)必须指向对象,但并没有定义这个引用应该如何定位和访问堆中对象…...
基于SpringBoot实现QQ邮箱发送短信功能 | 免费短信服务
开发学习过程中有个短信发送功能,阿里云腾讯云等等都要money,听说qq邮箱可以实现免费发送邮箱的功能(短信发送的平替),就用这个来实现!!!【找了好多好多方法才成功的啊啊啊啊&#x…...
【MySQL】聚合函数、group by子句
目录 聚合函数 count([distinct] column) sum([distinct] column) avg([distinct] column) max([distinct] column) min([distinct] column) group by子句 1.如何显示每个部门的平均薪资和最高薪资 2.显示每个部门每种岗位的平均薪资和最低薪资 3.显示平均工资低于200…...
详细分析SpringMvc中HandlerInterceptor拦截器的基本知识(附Demo)
目录 前言1. 基本知识2. Demo3. 实战解析 前言 对于Java的基本知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新) 1. 基本知识 HandlerInter…...
阳光能源嵌入式面试及参考答案(2万字长文)
管道能够承载的最大传输数据量是多少? 在嵌入式系统中,管道能够承载的最大传输数据量取决于多个因素。 首先,管道的容量受到操作系统的限制。不同的操作系统对管道的大小有不同的规定。一般来说,管道的容量通常是有限的,并且在不同的操作系统版本和配置下可能会有所不同。…...
有了域名和主机怎么做网站/网上做广告怎么收费
2019独角兽企业重金招聘Python工程师标准>>> 前面两篇文章说了怎么样简单的使用commons-pool库,这里需要考虑一个问题就是在很多时候我们在池里的对象都是比较重型的并且大多数比较稀缺的资源,比如说数据库连接,这样如果一直把一些…...
wordpress不显示子分类/优化大师下载安装免费
概述 在爬虫相关的项目中,有时需要爬取各种数据结构的数据,为了更方便的存储,我们通常会使用 MongoDB 进行存储。 本文将使用 Python 连接 MongoDB ,对数据进行增删改的操作实践,读者需要先对 Python 或 MongoDB 有一…...
有关风水的网站建设栏目/2023广东最新疫情
文章目录摘要一、Introduction1、引入原因2、结构框架二、相关工作1、新闻推荐算法2、推荐中的强化学习3、问题定义三、实现原理1、模型框架2、特征构造3、深度强化推荐Deep Reinforcement Recommendation4、用户活跃度5、探索四、实验结果1、数据集2、评价指标3、实验设置4、性…...
消息提示怎么做网站/百度知道电脑版网页入口
1 /*2 题意: 有两棵苹果树,每一棵苹果树每一秒间隔的掉落下来一个苹果,一个人在树下接住苹果,不让苹果掉落!3 人在两棵树之间的移动是很快的!但是这个人移动的次数是有限制的,问最多可以…...
从哪些方面做好网站的seo/西安疫情最新数据
问题mysqlbinlog 是将 binlog 解析成可读可执行的 SQL 的重要工具。但解析体积较大的 binlog 时,如何查看 mysqlbinlog 的执行进度就变成了一个问题,mysqlbinlog 并未提供 –progress 这样的参数。那要怎么查看 mysqlbinlog 的解析进度?实验我…...
重庆网站维护制作/seo优化的主要任务包括
修改OS X环境变量 打开终端,在终端中使用vim打开“~/.bash_profile”,如果没有安装vim,那就显示隐藏文件用文本编辑器打开,具体操作这里就不复述了。在.bash_profile中添加以下内容: PATH"/usr/local/mysql/bin…...