【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.rhkb.cn/news/39254.html

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

相关文章

系统思考与心智模式

“问题不是出在我们做了多少&#xff0c;而是出在我们做了什么。” — 赫尔曼凯恩 “一分耕耘一分收获”&#xff0c;这似乎是我们脑海中根深蒂固的心智模式。今天&#xff0c;我在一家餐厅用餐&#xff0c;店员告诉我&#xff0c;打卡收藏可以获得一份小食。没过多久&#xf…

纯文本驱动的数据可视化革命——AI生成图表「图表狐」全场景深度解析

一、技术架构重定义 图表狐核心能力边界 ✅ 纯文本输入&#xff1a;支持任意格式文字描述&#xff08;会议纪要/邮件/手写笔记&#xff09; ✅ 智能解析引擎&#xff1a; 实体识别&#xff08;数值/时间/分类维度&#xff09; 语义纠错&#xff08;自动修复错别字/单位混乱&…

多线程 --- 进程和线程的基本知识

进程 前面我们提到了一个概念是&#xff0c;多任务操作系统&#xff0c;即希望该系统能够同时运行多个程序。本质上说&#xff0c;进程&#xff0c;就算用来解决”并发编程“这样的问题的。 在一些特定的情况下&#xff0c;进程的表现&#xff0c;其实并不能很好的解决”并发…

SCI英文论文Accepted后的第一步——Rights and Access

SCI英文论文Accepted后的第一步——Rights and Access 目录 SCI英文论文Accepted后的第一步——Rights and AccessBased on information provided the embargo period/end date is 24 months. 因为选择闭源**Rights and Access(版权与访问权限)**环节是关键第一步,具体操作流…

流程控制语句

python中的流程控制语句有三种&#xff0c;顺序结构、条件结构和循环结构 1&#xff09;顺序结构&#xff1a; 从上往下&#xff0c;从左到右&#xff0c;依次逐行执行。 #顺序结构python print(start) print(hello world1 ) print(hello world2 ) print(hello world3 ) pri…

2.4 关键路径法

项目进度管理核心工具全解析 &#x1f680; 一、关键路径法&#xff08;CPM&#xff09;精要 1. 核心概念图解 #mermaid-svg-5MOABZm9lR8A53ss {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-5MOABZm9lR8A53ss .e…

Unity 实现一个简易可拓展性的对话系统

本人能力有限,一切实现仅供参考,如有不足还请斧正 起因是我看到学校社团内有人做了对话系统的分享,我想了想之前没写过这种东西,而Fungus插件教程太老了,NodeCanvas插件学习成本又比较高,我就干脆寻找资料 加上自己迭代一下,花了一天时间完成了这个对话系统 目录 1.介绍 2.核…

架构思维:通用系统设计方法论_从复杂度分析到技术实现指南

文章目录 Question订单履约原始架构痛点目标架构架构图说明关键设计点优点 设计方法论复杂来源解决方案评估标准从设计原则出发 技术实现 &#xff08;以选型Redis为例&#xff09;Redis消息队列的实现细节高可用设计 总结 Question 我们经常聊如何设计一个比较完善的系统&…

llama源码学习·model.py[7]Transformer类

一、源码展示 class Transformer(nn.Module):def __init__(self, params: ModelArgs):super().__init__()self.params paramsself.vocab_size params.vocab_sizeself.n_layers params.n_layersself.tok_embeddings VocabParallelEmbedding(params.vocab_size, params.dim,…

MD2Card(markdown)

MD2Card 介绍&#xff1a; 1.小红书爆款神器&#xff0c;Markdown笔记秒转高颜值卡片 2.实时预览15种主题&#xff0c;自动拆长文&#xff0c;图片/SVG导出即用 3.零门槛不登录&#xff0c;免费无限生成&#xff0c;专治排版废和设计手残党 网站地址&#xff1a; https://md2…

第二节第一部分:String字符串

一、导包 二、String字符串 三、String注意事项 四、字符串的比较 五、面试例题 六、String案例一 需求分析&#xff1a; 代码&#xff1a; package com.StringTest;import java.util.Scanner;public class StingTest {public static void main(String[] args) {//1.开发一个…

动态规划(01背包恰好装满型详解):和为目标值的最长子序列长度

0-1背包&#xff1a;有n个物品&#xff0c;第i个物品的体积为w[i]&#xff0c;价值为v[i]&#xff0c;每个物品至多选择一个&#xff0c;求体积和不超过capacity的最大价值和。 对于第i个物品&#xff0c;我们只有两种选择&#xff1a;选&#xff0c;或者不选。如果选&#xf…

Spring漏洞再现

一、CVE-2017-8046 1、开环境 2、访问目录 /customers/1 3、在当前页抓包&#xff0c;并修改数据包 PATCH /customers/1 HTTP/1.1 Host: 150.158.199.164:8080 Accept-Encoding: gzip, deflate Accept: */* User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1;…

Ftrans飞驰云联受邀参加“2025汽车零部件CIO年会“并荣获智象奖

2025年3月6日&#xff0c;由栖观汽车、栖观资讯和飞羽商务主办的“2025第二届中国汽车&零部件CIO年会暨智象奖颁奖盛典”于上海盛大召开&#xff0c;Ftrans飞驰云联作为国内领先的企业文件传输与数据交换解决方案提供商&#xff0c;受邀出席了年会&#xff0c;并凭借卓越的…

西门子 CPU 1513-1 PN TCP Server 接收字符串前多了一个问号

TIA V17编程环境中(CPU 1513-1 PN),调用TSEND_C以TCP协议向TCP Server发送字符串:abded1234,TCP Server接收到的字符串多了一个问号:?avded1234. TSEND_C 指令的 DATA DB为非优化string类型数据 截图如下: 字符串前面两个字节不是起始字符,第一个是字节是字符串最大长度…

Matlab2024a免费版下载教程

Matlab是一个高性能的数学计算与仿真软件&#xff0c;广泛应用于科学计算、数据分析、算法开发以及工程绘图等多个领域。它提供了强大的矩阵运算能力、丰富的内置函数库以及灵活的编程环境&#xff0c;使得用户能够高效地解决复杂的数学问题。本文&#xff0c;我将为大家详细介…

SpringCould微服务架构之Docker(1)

项目中微服务比较多的时候&#xff0c;一个一个手动的部署太麻烦了&#xff0c;所以就需要用到Docker。 项目部署中的问题&#xff1a; Docker是一种快速交付应用、运行应用的技术。

软件公司高新技术企业代办:机遇与陷阱并存-优雅草卓伊凡

软件公司高新技术企业代办&#xff1a;机遇与陷阱并存-优雅草卓伊凡 在科技飞速发展的当下&#xff0c;软件公司如雨后春笋般涌现&#xff0c;众多企业渴望通过申请高新技术企业来获得政策支持与发展助力。随之而来的&#xff0c;是高新技术企业代办业务的兴起。然而&#xff…

动捕技术革新虚拟直播:解码虚拟主播的“拟真感“破局之路

在元宇宙技术加速落地的今天&#xff0c;虚拟直播已从早期的卡通形象展示&#xff0c;进化为具备情感交互的沉浸式体验&#xff0c;用户对"高拟真度互动"的需求也逐渐增加&#xff0c;这场行业变革的核心驱动力&#xff0c;离不开动捕技术的持续迭代。 虚拟直播的&q…

python字节码文件.pyc反编译成.py文件

一、前言 在 Python 开发过程中&#xff0c;.pyc 文件&#xff08;Python 字节码文件&#xff09;是 Python 解释器运行程序时生成的一种中间文件。它通常用于提高程序的运行效率&#xff0c;避免每次运行时都重新编译源代码。然而&#xff0c;由于各种原因&#xff0c;我们可…