Git教程学习:09 Git分支

文章目录

    • 1 分支的简介
    • 2 分支的相关操作
      • 2.1 分支的创建
      • 2.2 分支的切换
      • 2.3 分支的合并
      • 2.4 分支推送到远程
      • 2.5 分支的删除
      • 2.6 分支的重命名
    • 3 分支开发工作流程
      • 3.1 长期分支
      • 3.2 短期分支

1 分支的简介

几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着我们可以把我们的工作从开发主线分离开来,从而影响开发主线。在很多版本控制系统中,效率稍低这个过程——通常需要完全创建一个源代码目录的副本。对于大项目来说,这样的过程会消耗很多时间。

有人把 Git 的分支模型称为它的“必杀技术特性”,也正因为这种特性,使得 Git 从队列版本控制系统中移动。为何 Git 的分支模型如此出众呢? Git 处理分支的方式就好比是速度非常轻,创建新分支这一操作几乎可以瞬间完成,并且在不同分支之间的切换操作也同样快捷。与许多其他版本控制系统不同,Git 鼓励在工作流程中间隔地使用分支与合并,这一天之内进行了许多次。理解并掌握了这一特性,我们就会意识到 Git 的强大的独特性,从而真正改变我们的开发方式。

2 分支的相关操作

2.1 分支的创建

使用git branch可以查看现有分支或创建新的分支。

当不带任何命令参数时,输入git branch可以帮助我们查看当前项目所拥有的全部分支。并且Git会使用*来标明我们当前所处的分支上。

$ git branch

image-20240118230917289

当我们在git branch后面加上<branchname>即可创建新分支:

$ git branch <branchname>
$ git branch

image-20240118231436602

2.2 分支的切换

使用git checkout <branchname>命令切换分支:

$ git checkout <branchname>
$ git branch

image-20240118231742584

切换分支后,我们就可以进行自己的开发。分支上的文件状态是不同的。我们可以通过下面的例子有着更深入的了解。

# 切换分支
$ git checkout issue102

# 在分支上创建新的文件
$ touch issue102.md
$ git add issue102.md
$ git commit -m "update issue102.md"

$ touch issue102.html
$ git add issue102.html
$ git commit -m "update issue102.html"

image-20240118232447601

在完成上述命令后,通过git log --oneline检查下当前Git的记录。

git log --oneline

image-20240118232558631

2.3 分支的合并

当我们在分支上完成来开发工作后,我们需要将我们在当前分支进行的工作合并到主分支上。首先我们需要切回需要合并到的分支上,此处以issue102合并到main上为例子进行演示:

# 切换回主分支
$ git checkout main

# 使用git merge进行合并
$ git merge issue102

# 查看所有未合并工作的分支
$ git branch --no-merged

image-20240118233250342

有时候分支的合并不会一番顺利,当我们在两个分支中对同一个文件的同一个部分进行了不同的修改,Git就没有办法顺利的合并他们,会在合并的时候产生合并冲突。比如我们在issue102分支和main分支下对issue102.md文件进行了修改,当我们将issue102分支融合到主分支上时就会发生冲突。如下图所示:

image-20240119000448761

我们也可以通过git status查看命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件。当出现矛盾后,合并的文件内容将会出现"<<<<<<“,”====“,”>>>>>>"等分割线来进行标记。如下图所示:

image-20240119001122308

当出现矛盾时,我们需要进行手动合并或者放弃合并

  • 手动合并:

手动合并的方法很简单,即我们选择要保留的代码,然后把>>>>>, ====, <<<<<<这些提示行给去掉。最后重新进行add commit的操作即可。

  • 放弃合并:

当冲突所导致的改动量很大时,我们可以选择放弃该次的合并。使用git merge --abort放弃此次的融合。如果我们在运行了git merge之后又进行了一些人为的改动,那么在abort之后,所进行的改动也会被回滚掉。

  • mergetool:

除了手动合并以及放弃合并之外,git官方开发了一个专门用来合并的工具,叫做git mergetool,它会将找到一份两个分支的祖先代码作为base(基准),然后再将两个分支的改动都列举出来作为对比,让我们在git编辑器当中决定要留下什么。

  • Use vimdiff as git mergetool
  • 使用vimdiff作为git mergetool

2.4 分支推送到远程

我们可以使用git remote -v查看远程库的详细信息。这会显示我们可以抓取或推送的origin地址。

$ git remote -v

image-20240119002451534

当我们需要推送本地分支到远程时,需要指定具体的本地分支:

# 推送本地的main分支到远程
$ git push origin main

# 推送本地的issue102分支到远程
$ git push origin issue102

image-20240119002715606

当我们多人协作进行开发的时候,我们就需要使用git pull的命令来试图合并。如果合并出现冲突时,我们需要解决冲突再提交。参考多人协作。

2.5 分支的删除

Git的分支删除可以分为删除本地分支删除远程分支

  • 删除本地分支
$ git branch -d <branchname>

# -D 表示强行删除分支
$ git branch -D <branchname>

image-20240119003806944

image-20240119003934144

  • 删除远程分支
# origin 是远程的主机名
# branchname 需要删除的远程分支名
$ git push origin --delete issue102

image-20240119004144009

2.6 分支的重命名

$ git branch -m oldBranchName newBranchName

当我们想要将改名后的分支推送到远程时,我们需要进行如下操作:

$ git branch -m oldBranchName newBranchName   # 将本地的分支进行重命名
$ git push origin newBranchName               # 将新的分支推送到远程       
$ git push --delete origin oldBranchName      # 删除远程的旧的分支 

image-20240119005002532

3 分支开发工作流程

当我们已经了解了分支的操作后,我们应该考虑使用一种怎样的方式使我们最大化的使用分支操作的优点。在接下来的这部分中,将会介绍一些常见的分支开发工作流程。而正是由于分支管理的便捷,才衍生出这些典型的工作模式,我们以后可以根据项目实际情况进行使用。

3.1 长期分支

因为 Git 使用简单的三方合并,所以即使在一段短暂的时机,反复把一个分支合并到另一个分支中,也不是难事。也就是说,在整个项目开发周期的不同阶段,我们可以同时拥有多个开放的分支,可以定期地把某些主题分支合并到其他分支中。

许多使用 Git 的开发者都喜欢使用这种方式来工作,比如只在main分支上保留完全稳定的代码——有可能已经发布或即将发布的代码。他们还有一些叫做develop或者next的分支,被用来做后续开发或者测试稳定性——这些分支必须保持稳定,一旦达到稳定状态,它们就可以被合并入main分支了。

image-20240119005738718

image-20240119005850421

一些大型项目还有一个proposed(建议)或pu: proposed updates(建议更新)分支,它可能因包含一些不成熟的内容而不能进入next或者main分支。

3.2 短期分支

短期分支也叫做主题分支,它对任何规模的项目都适用。主题分支是一种短期分支,它被用来实现单一功能或者相关工作。比如bug分支issue分支develop分支topic分支

分支开发工作流程基本原则:

  • master分支应该是最稳定的,也就是仅用来发布新版本,平时不能直接在上面进行操作,应该保存在远程。

  • 短期分支是我们干活的分支,短期分支可以不用上传到远程,当我们完成了bug的修复,新功能的开发时才需要合并到主分支上。

  • 多使用分支来进行开发工作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机硬件 6.1BIOS

第六章 计算机基本程序 第一节 BIOS与CMOS芯片 一、认识BIOS 1.中文含义&#xff1a;基本输入输出系统。 2.材质&#xff1a;ROM&#xff08;Flash Rom&#xff09; 3.地位&#xff1a;是操作系统与硬件之间的接口。 4.存放内容&#xff1a;①基本输入输出系统&#xff1b;…

自动化防DDoS脚本

简介 DDoS &#xff08;分布式拒绝服务攻击&#xff09;是一种恶意的网络攻击&#xff0c;旨在通过占用目标系统的资源&#xff0c;使其无法提供正常的服务。在DDoS攻击中&#xff0c;攻击者通常控制大量的被感染的计算机或其他网络设备&#xff0c;同时将它们协调起来向目标系…

行业分析|中国人工智能发展的优势与差距

​人工智能&#xff0c;被誉为第四次工业革命的催化剂&#xff0c;吸引着发达国家和众多科技公司大举投入研发。我国积极构筑人工智能发展的先发优势&#xff0c;党的二十大报告提出推动战略性新兴产业集群&#xff0c;构建一系列新的增长引擎&#xff0c;包括信息技术、人工智…

基于变异混合蛙跳算法的车间调度最优化matlab仿真,可以任意调整工件数和机器数,输出甘特图

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 车间调度问题&#xff08;JSSP&#xff09;描述 4.2 蛙跳算法&#xff08;SFLA&#xff09;基本原理 4.2.1 初始化 4.2.2 局部搜索 4.2.3 全局信息交换 4.2.4 变异策略 4.2.5 终止…

编写后端代码,使用yakit将任意字典进行编码发送,后端解码输出到页面上

挂上代理&#xff08;小狐狸&#xff09;&#xff1a; yakit中挂上劫持&#xff1a; 编写后端代码&#xff1a; 一个简单的登录代码 访问页面&#xff1a; 给予传参后看yakit劫持了没有 yakit劫持&#xff1a; 将劫持到的数据发送到webFuzzer&#xff1a; 右键选择标签/字典—…

c\c++队列的链式表示(对小白友好)

文章目录 1.链式队列的定义2.初始化3.判断空4.入队5. 出队6.打印全部元素7.源代码 本篇中的链式表示都是带头结点的链式表示。 1.链式队列的定义 typedef struct LinkNode { //链式队列的结点int data;struct LinkNode *next; }LinkNode; typedef struct { //链式…

如何创建以业务为中心的AI?

AI是企业的未来&#xff0c;这一趋势越来越明显。各种AI模型可以帮助企业节省时间、提高效率并增加收入。随着越来越多的企业采用AI&#xff0c;AI很快就不再是一种可有可无的能力&#xff0c;而是企业参与市场竞争的必备能力。 然而&#xff0c;作为一名业务决策者&#xff0c…

pcl之滤波器(二)

pcl滤波器 pcl一共是有十二个主要模块&#xff0c;详细了解可以查看官网。https://pcl.readthedocs.io/projects/tutorials/en/latest/#basic-usage 今天学习一下pcl的滤波器模块。 滤波器模块&#xff0c;官网一共是提供了6个例程&#xff0c;今天看第三个、第四个。 滤波…

(学习日记)2024.01.23:结构体、位操作和枚举类型

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

【学网攻】 第(3)节 -- 交换机配置聚合端口

文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用 前言 网络已经成为了我们生活中不可或缺的一部分&#xff0c;它连接了世界各地的人们&#xff0c;让信息和资源得以自由流动。随着互联网的发展&#xff0c;我们可以通过网络学习、工作、娱乐…

最新综述!3D Gaussian Splatting

作者&#xff1a;小柠檬 | 来源&#xff1a;3DCV 在公众号「3DCV」后台&#xff0c;回复「原论文」可获取论文 文章介绍了3D高斯喷洒在场景重建和渲染中的应用&#xff0c;并探讨了其在机器学习和计算机视觉领域的潜在应用。文章还提供了3D高斯喷洒的基本原理和优化方法&#x…

MoEs学习

和多任务学习的mmoe很像哦&#xff08;有空再学习一下&#xff09;moe layer的起源&#xff1a;Switch Transformers paper MoE moe由两个结构组成&#xff1a; Moe Layer &#xff1a;这些层代替了传统 Transformer 模型中的前馈网络 (FFN) 层。MoE 层包含若干“专家”(例如…

解读顺网算力与AI,破局AIGC落地“最后一公里”

全球知名AI科学家吴恩达和李飞飞在CES 2024上预测&#xff0c;2024年将是AI技术继续深化的一年&#xff0c;将成为下一次数字或工业革命真正的变革性驱动力。吴恩达还预测了2024年AI可能的突破性进展&#xff0c;其中包括边缘AI。吴恩达对边缘AI寄予厚望&#xff0c;他认为在笔…

luceda ipkiss教程 57:画微环调制器

案例分享&#xff1a;画微环调制器 全部代码如下&#xff1a; from si_fab import all as pdk from ipkiss3 import all as i3class DC(i3.PCell):straight_length i3.PositiveNumberProperty(default200)radius i3.PositiveNumberProperty(default50)spacing i3.Positive…

坚持刷题 |对称二叉树

文章目录 题目考察点代码实现实现总结扩展用迭代的方式判断是否为对称二叉树递归和迭代的对比可能的扩展提问 坚持刷题&#xff0c;老年痴呆追不上我&#xff0c;今天真的好累&#xff0c;就不难为自己了&#xff0c;刷个简单级别的吧&#xff1a;对称二叉树 题目 101.对称二叉…

Scapy编程指南(基础概念)

Scapy编程指南&#xff08;基础概念&#xff09; Scapy是什么 Scapy是Python中一个非常强大的库&#xff0c;它专门用于处理、发送和捕获网络协议中的数据包&#xff0c;它允许开发人员通过Python代码构建、解析和发送自定义网络协议的数据包。Scapy提供了一种直观、灵活的方…

luffy商城项目(二)

路飞后端配置 二次封装response drf提供的Response对象&#xff0c;不能很方便的加入code和msg字段&#xff0c;自己封装一个Response类&#xff0c;以后都用我们自己封装的&#xff0c;方便咱们写code和msg 封装步骤&#xff1a; 1 在utils/common_response.py from rest_…

GitLab升级版本(任意用户密码重置漏洞CVE-2023-7028)

目录 前言漏洞分析影响范围查看自己的GitLab版本升级路程 升级过程13.1.1113.8.8 - 14.0.1214.3.614.9.5 - 16.1.6 前言 最近GitLab发了个紧急漏洞需要修复&#xff0c;ok接到命令立刻着手开始修复&#xff0c;在修复之前先大概了解一下这个漏洞是什么东西 漏洞分析 1、组件…

【立创EDA-PCB设计基础】6.布线铺铜实战及细节详解

前言&#xff1a;本文进行布线铺铜实战及详解布线铺铜的细节 在本专栏中【立创EDA-PCB设计基础】前面完成了布线铺铜前的设计规则的设置&#xff0c;接下来进行布线 布局原则是模块化布局&#xff08;优先布局好确定位置的器件&#xff0c;例如排针、接口、主控芯片&#xff…

《WebKit 技术内幕》学习之十一(2):多媒体

2 视频 2.1 HTML5视频 在HTML5规范定义中&#xff0c;Web开发者可以使用“video”元素来播放视频资源。视频中有个重要的问题就是视频编码格式&#xff0c;对此&#xff0c;目前标准中包含了三种编码格式&#xff0c;它们分别是Ogg、MPEG4和WebM。其中Ogg是由Xiph.org组织开…