制作网页网站小说教程/今天新闻头条

制作网页网站小说教程,今天新闻头条,郑州二手房,做市级网站需要什么Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: Git 本篇博客我们来介绍Git的一个重要功能之一 ---- 分支。我们将讲解关于分支的各种操作,以及如何帮助我们进行开发。 🏠 理解分支…

 Welcome to 9ilk's Code World

       

(๑•́ ₃ •̀๑) 个人主页:       9ilk

(๑•́ ₃ •̀๑) 文章专栏:     Git


   本篇博客我们来介绍Git的一个重要功能之一 ---- 分支。我们将讲解关于分支的各种操作,以及如何帮助我们进行开发。


🏠 理解分支

假设你处于一个平行宇宙,主时间线里你按部就班的学者C++,OS,另一个时间线的里学着Java,到达某一个时间点时两个时空合并,此时相当于你在一段时间掌握的技能增加了,这里平行时空2相当于是在当前分支基础上创建一个新分支,到达某一个时间点,我们再将两个分支合并

head与master

在版本回退里,每次提交,Git都会把他们串成一条时间线,这条时间线可以理解为是一个分支。截止到目前,我们只有一条时间线,在Git里,这个分支叫主分支,即master分支

再来理解一下,HEAD指针严格来说不是指向提交,而是指向mastermaster才是指向提交所以HEAD(默认)指向的是当前分支

每次提交,master分支都会向前移动一步,随着你的不断提交,master分支的线也越来越长,而HEAD只要一直指向master分支即可指向当前分支。通过查看当前的版本库,我们也能清晰的观察:拿到master分支,我们就能通过parent依次拿到该分支下之前的一个个提交。

🏠 创建、切换、合并分支

当我们创建本地仓库时,Git会自动给我们创建master分支,如果我们想查看本地有哪些分支,我们可以使用 git branch 命令

  • * 表示当前正在master分支工作。
  • HEAD不仅可以指向master分支,也可以指向其他分支,其中被HEAD指向的分支就是我们当前的工作分支。

创建分支

git branch + 分支名

创建完一个新的分支之后,我们可以使用git branch验证一下是否创建了新分支:

还可以在.git目录树上验证:

由于我们创建dev分支是基于master分支创建的,所以创建出来之后会指向最近的一次提交:

时间线图如下:

切换分支

我们之前说HEAD所指向分支为当前工作分支,那如何切换当前工作分支呢?我们可以使用命令git checkout + 分支名

git checkout + 分支名

使用git branch操作验证下是否切换成功:

切换后的时间线如图:

合并分支

由于当前dev分支只是刚基于master分支创建,合并没什么意义,我们对dev分支做一次提交

修改ReadMe文件:

两板斧提交:

zhuang@VM-8-14-ubuntu:~/gitcode$ git add ReadMe
zhuang@VM-8-14-ubuntu:~/gitcode$ git commit -m "md ReadMe"
[dev 3165a96] md ReadMe1 file changed, 2 insertions(+), 1 deletion(-)
zhuang@VM-8-14-ubuntu:~/gitcode$ git status
On branch dev
nothing to commit, working tree clean

此时我们切换到master分支观察变化:

此时我们切换到dev分支:

为什么切换到master分支下我们没有观察到变化,而在dev分支上内容还在呢? 

这是因为我们是在dev分支上提交的,而master分支此刻的提交点没有变,即没有在master分支上master进行提交,时间线不会延长,此时状态如图:

当切换到master分支时,HEAD指向了master,此时自然看不到提交。

此时如果我们想让我们之前修改的信息能在master分支上能查看到,此时需要合并两个分支,但是注意master合并dev,需要先切换到master,再合并

git checkout + 要合并到的分支
git merge + 要合并的分支

此时我们就能在master分支上查看到我们之前修改的信息了:

  • Fast-forward表示快进模式(快速提交),直接把master的指向指向dev的最新提交,合并起来很快

合并后的时间线图如下:

合并之后如果我们在master分支下再进行一次提交会发生什么?

合并之后并不是指dev分支等同于master分支了,而是将dev时间线的各个版本与master分支进行合并,往后他们各自还是独立的:

🏠 删除分支

将master分支和dev分支合并完之后,dev的使命基本结束了,此时我们需要把它删除,那怎么删除一个分支呢?

git branch -d + 要删除的分支名

注意:要删除一个分支时,需要先切换到其他分支,否则会报错

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

🏠 合并冲突

合并分支不是说能随便合并的,合并时也可能出现冲突:

假设master分支上已经有aaa on branch的提交,我们模拟剩下的内容:

(1)在dev分支上提交 ccc on branch

zhuang@VM-8-14-ubuntu:~/gitcode$ git checkout -b dev1
Switched to a new branch 'dev1'

补充选项git checkout的-b选项帮我们完成两件事:先帮我们创建新分支,再切换到新分支上

zhuang@VM-8-14-ubuntu:~/gitcode$ vim ReadMe
zhuang@VM-8-14-ubuntu:~/gitcode$ git add ReadMe
zhuang@VM-8-14-ubuntu:~/gitcode$ git commit -m "bb ReadMe"
[dev1 700c7b6] bb ReadMe1 file changed, 1 insertion(+), 1 deletion(-)

(2)在master分支上提交ccc on branch

zhuang@VM-8-14-ubuntu:~/gitcode$ git checkout master
Switched to branch 'master'
zhuang@VM-8-14-ubuntu:~/gitcode$ vim ReadMe
zhuang@VM-8-14-ubuntu:~/gitcode$ git add ReadMe
zhuang@VM-8-14-ubuntu:~/gitcode$ git commit -m "cc ReadMe"
[master a5c1371] cc ReadMe1 file changed, 1 insertion(+), 1 deletion(-)

(3)合并分支

我们打开ReadMe文件查看冲突内容,Git会用<<<<<<<,=======, >>>>>>>来标记出不同分支的冲突内容:

此时我们需要自己决策,手动调整冲突代码,并需要再次提交修正后的结果!

此时的时间线图如下:

如果我们想查看分支的合并情况,也可以使用git log命令带上 --graph  --abrev-commit选项

🏠 合并模式

Fast-forward 模式

这里我们创建新分支dev2,提交一次之后与master分支进行合并,我们git log看看结果:

在这种Fast forward模式下,删除分支之后,查看分支历史时,会丢掉分支信息,看不出来最新提交到底时merge进来的还是正常提交的。

no-ff模式

在合并冲突部分,我们也看到通过解决冲突问题,会再进⾏⼀次新的提交,得到的最终状态为:

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

Git⽀持我们强制禁⽤ Fast forward 模式(带上--no-ff选项),那么就会在merge时⽣成⼀个新的 commit ,这样,从分⽀历史上就可以看出分⽀信息:

在dev2分支上提交:

使用no-ff模式,此时需要一次新的提交,需要带上-m选项:

用git log查看:

此时时间线图如下:

🏠 分支策略

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布
时,再把dev分支合并到master上,在master分支发布1.0版本;(类似王者荣耀更新版本);你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。所以,团队合作的分支看起来就像这样:

🏠 Bug分支

线上环境不是百分百稳定,master主分支也可能有bug,我们应该单独创建一个专门修复master分支bug的分支再合并,不能直接在master分支上修改bug有可能改出一个更大bug

我们要模拟的场景如下:

(1)dev2分支正在开发(I am coding)

(2) 暂存dev2分支工作区内容

由于dev2分支开发时只是对工作区进行修改并未提交所以会影响master,此时我们可以使用git stash命令先将工作区内容暂存起来

此时我们发现在.git目录下多了个stash分区:

注意 git stash命令只能存储之前被追踪管理过的文件内容

(3) 创建bug分支修改分支

假设bug为:

创建fix_bug分支修改bug提交之后然后与master分支合并:

(4) 修复完bug切回dev2分支继续开发

git stash list展示stash里存了什么

git stash pop将stash内容放出来

我们将内容恢复然后在dev2分支上进行提交

此时我们注意到,bug修复的内容在dev2分支上没有显示,这是因为master分支目前最新的提交,是要领先于新建dev2时基于的master分支的提交的。

我们最终目的是让master合并dev2分支,但是这样是有风险的,这是因为在合并分支时可能会有冲突,而代码冲突需要我们手动解决(在master分支上解决),我们无法保证对于冲突问题可以正确地一次性解决,实际开发中,代码冲突不只一行两行那么简单,解决过程出错难免,导致错误的代码合并到master分支上。此时状态为:

解决这个问题的一个好的建议就是:最好在自己的分支上(dev2)合并下master,再让master去合并dev2,这样做的目的是有冲突可以在本地分支解决并进行测试,而不影响master。此时的状态为:

演示:

dev2合并master

再将dev2合并到master

最后删除fix_bug和dev2

zhuang@VM-8-14-ubuntu:~/gitcode$ git branchdev2fix_bug
* master
zhuang@VM-8-14-ubuntu:~/gitcode$ git branch -d dev2 fix_bug
Deleted branch dev2 (was 1714a31).
Deleted branch fix_bug (was dffd15d).

🏠 强制删除分支

我们之前git branch -d删除分支的前提是merge,git认为只要你创建分支不能随便删,此时我们确定该分支可以删,只需改选项-D表示强行删除

git branch -D 分支名


总结分支相关操作:

1. 创建分支 : git branch

2. 切换分支 : git checout 

3. 创建 + 切换分支 : git checkout -b 

4. 合并分支 : git merge 

5. 删除分支 : git branch -d 

6. 查看分支情况 : git log --graph  --abrev-commit

7. no-ff模式合并 : git merge --no-ff -m "message" 

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

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

相关文章

Vue3前端开发:组件化设计与状态管理

Vue3前端开发&#xff1a;组件化设计与状态管理 一、Vue3组件化设计 组件基本概念与特点 是一款流行的JavaScript框架&#xff0c;它支持组件化设计&#xff0c;这意味着我们可以将页面分解成多个独立的组件&#xff0c;每个组件负责一部分功能&#xff0c;通过组件的嵌套和复用…

动手学深度学习11.9. Adadelta-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;72 优化算法【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址&#xff1a;11.9. Adadelta —…

Android Audio基础(13)——audiomixer

在 Android 平台上&#xff0c;音频混合器 AudioMixer 主要用在 AudioFlinger 里&#xff0c;将多路音频源数据混音&#xff08;包括混音、音量处理、重采样及处理声道等&#xff09;。位于 framework 的音频处理模库 libaudioprocessing&#xff08;frameworks/av/media/libau…

Matlab教程001:软件介绍和界面使用

1.1 软件介绍 1.1.1 Matlab的介绍 MATLAB&#xff08;MATrix LABoratory&#xff09;是一款由 MathWorks 公司开发的高级编程语言和交互式环境&#xff0c;广泛用于 科学计算、数据分析、机器学习、工程建模、仿真和信号处理 等领域。 1.1.2 主要应用领域 数据分析与可视化…

毫米波雷达标定(2)

1. 前言 前面文章中介绍了产线上毫米波雷达的标定原理和流程,这篇文章则主要介绍其在线标定方法。相对于产线标定,在线标定具备使用自然场景而不是依赖特定标靶的优点,但因此其标定精度会相对差一点。在线标定一般应用于售出产品的维护场景,如果其标定结果精度可以满足使用…

Linux fority source和__builtin_xxx

这段代码是用于启用和配置 GCC/Clang 的 Fortify Source 安全机制的预处理指令。Fortify Source 主要用于在编译时增强对缓冲区溢出等内存安全问题的检查。以下是对每一部分的详细解释&#xff1a; 1. 最外层条件编译 # if CONFIG_FORTIFY_SOURCE > 0目的&#xff1a;检查…

语言模型理论基础-持续更新-思路清晰

1.预训练 相似的任务A、B&#xff0c;任务A已经用大数据完成了训练&#xff0c;得到模型A。 我们利用-特征提取模型的-“浅层参数通用”的特性&#xff0c;使用模型A的浅层参数&#xff0c;其他参数再通过任务B去训练&#xff08;微调&#xff09;。 2.统计语言模型 通过条件…

ResNet与注意力机制:深度学习中的强强联合

引言 在深度学习领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;一直是图像处理任务的主流架构。然而&#xff0c;随着网络深度的增加&#xff0c;梯度消失和梯度爆炸问题逐渐显现&#xff0c;限制了网络的性能。为了解决这一问题&#xff0c;ResNet&#xff08;残差…

【C++】——C++11新特性

目录 前言 1.初始化列表 2.std::initializer_list 3.auto 4.decltype 5.nullptr 6.左值引用和右值引用 6.1右值引用的真面目 6.2左值引用和右值引用比较 6.3右值引用的意义 6.3.1移动构造 6.4万能引用 6.5完美转发——forward 结语 前言 C&#xff0c;这门在系统…

【C++网络编程】第5篇:UDP与广播通信

一、UDP协议核心特性 1. UDP vs TCP ​特性 ​UDP​TCP连接方式无连接面向连接&#xff08;三次握手&#xff09;可靠性不保证数据到达或顺序可靠传输&#xff08;超时重传、顺序控制&#xff09;传输效率低延迟&#xff0c;高吞吐相对较低&#xff08;因握手和确认机制&…

ffmpeg+QOpenGLWidget显示视频

​一个基于 ‌FFmpeg 4.x‌ 和 QOpenGLWidget的简单视频播放器代码示例&#xff0c;实现视频解码和渲染到 Qt 窗口的功能。 1&#xff09;ffmpeg库界面&#xff0c;视频解码支持软解和硬解方式。 硬解后&#xff0c;硬件解码完成需要将数据从GPU复制到CPU。优先采用av_hwf…

20250324-使用 `nltk` 的 `sent_tokenize`, `word_tokenize、WordNetLemmatizer` 方法时报错

解决使用 nltk 的 sent_tokenize, word_tokenize、WordNetLemmatizer 方法时报错问题 第 2 节的手动方法的法1可解决大部分问题&#xff0c;可首先尝试章节 2 的方法 1. nltk.download(‘punkt_tab’) LookupError: *******************************************************…

【VolView】纯前端实现CT三维重建-CBCT

文章目录 什么是CBCTCBCT技术路线使用第三方工具使用Python实现使用前端实现 纯前端实现方案优缺点使用VolView实现CBCT VolView的使用1.克隆代码2.配置依赖3.运行4.效果 进阶&#xff1a;VolView配合Python解决卡顿1.修改VtkThreeView.vue2.新增Custom3DView.vue3.Python生成s…

debug - 安装.msi时,为所有用户安装程序

文章目录 debug - 安装.msi时&#xff0c;为所有用户安装程序概述笔记试试在目标.msi后面直接加参数的测试 备注备注END debug - 安装.msi时&#xff0c;为所有用户安装程序 概述 为了测试&#xff0c;装了一个test.msi. 安装时&#xff0c;只有安装路径的选择&#xff0c;没…

Java Stream两种list判断字符串是否存在方案

这里写自定义目录标题 背景初始化方法一、filter过滤方法二、anyMatch匹配 背景 在项目开发中&#xff0c;经常遇到筛选list中是否包含某个子字符串&#xff0c;有多种方式&#xff0c;本篇主要介绍stream流的filter和anyMatch两种方案&#xff0c;记录下来&#xff0c;方便备…

3. 轴指令(omron 机器自动化控制器)——>MC_SetOverride

机器自动化控制器——第三章 轴指令 12 MC_SetOverride变量▶输入变量▶输出变量▶输入输出变量 功能说明▶时序图▶重启运动指令▶多重启动运动指令▶异常 MC_SetOverride 变更轴的目标速度。 指令名称FB/FUN图形表现ST表现MC_SetOverride超调值设定FBMC_SetOverride_instan…

VLAN章节学习

为什么会有vlan这个技术&#xff1f; 1.通过划分广播域来降低广播风暴导致的设备性能下降&#xff1b; 2.提高网络管理的灵活性和通过隔离网络带来的安全性&#xff1b; 3.在成本不变的情况下增加更多的功能性&#xff1b; VLAN又称虚拟局域网&#xff08;再此扩展&#xf…

FPGA时钟约束

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、Create_clock 前言 时钟周期约束&#xff0c;就是对时钟进行约束。 一、Create_clock create_clock -name <name> -period <period> -waveform …

spring-security原理与应用系列:建造者

目录 1.构建过程 AbstractSecurityBuilder AbstractConfiguredSecurityBuilder WebSecurity 2.建造者类图 SecurityBuilder ​​​​​​​AbstractSecurityBuilder ​​​​​​​AbstractConfiguredSecurityBuilder ​​​​​​​WebSecurity 3.小结 紧接上一篇文…

OpenHarmony子系统开发 - 电池管理(二)

OpenHarmony子系统开发 - 电池管理&#xff08;二&#xff09; 五、充电限流限压定制开发指导 概述 简介 OpenHarmony默认提供了充电限流限压的特性。在对终端设备进行充电时&#xff0c;由于环境影响&#xff0c;可能会导致电池温度过高&#xff0c;因此需要对充电电流或电…