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的修复,新功能的开发时才需要合并到主分支上。

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

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

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

相关文章

使用DockerFile构建镜像与镜像上传

目录 前言&#xff1a;为什么要使用Dockerfile &#xff1f; DockerFile构建镜像 1、构建基础对象 2、Dockerfile文件结构 3、构建Dockerfile文件镜像 二、镜像上传&#xff08;阿里云&#xff09; 前言&#xff1a;为什么要使用Dockerfile &#xff1f; 首先Dockerfile …

网安防御保护防火墙初使用

要求 搭建之后 配置如下&#xff1a; 首先看要求是使用总公司部分则&#xff0c;先配置总公司的防火墙&#xff0c;注意配置总公司防火墙进入G0/0/0口的IP有个默认192.168.0.1 24&#xff0c;但是我们的云&#xff08;cloud&#xff09;上增加的端口绑定网卡IP为192.168.100.1…

React Router v6 改变页面Title

先说正事再闲聊 1、在路由表加个title字段 2、在index包裹路由 3、在App设置title 闲聊&#xff1a; 看到小黄波浪线了没 就是说默认不支持title字段了 出来的提示&#xff0c; 所以我本来是像下面这样搞的&#xff0c;就是感觉有点难维护&#xff0c;就还是用上面的方法了 …

高效工作必备神器:这款在线绘图软件完美替代Visio!

Visio是什么软件&#xff1f; Visio是微软公司开发的一款专业化的流程图绘制辅助工具&#xff0c;主要用于帮助IT和商务人员对复杂信息、系统和流程进行可视化处理、分析和交流。Visio提供了丰富的绘图功能&#xff0c;用户可以利用它创建各种类型的图表&#xff0c;包括但不限…

如何在Docker下部署MinIO存储服务通过Buckets实现文件的远程上传

&#x1f4d1;前言 本文主要是Linux下通过Docker部署MinIO存储服务实现远程上传的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#…

Linux操作系统——理解文件系统

预备知识 到目前为止&#xff0c;我们所学习到的关于文件的操作&#xff0c;全部都是基于文件被打开&#xff0c;被访问&#xff0c;访问期间比较重要的有重定向&#xff0c;缓冲区&#xff0c;一切皆文件&#xff0c;当我们访问完毕的时候需要将文件关闭&#xff0c;关闭时那…

SpringBoot:Bean生命周期自定义初始化和销毁

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、Bean注解指…

【服务器】安装Docker环境

目录 &#x1f33a;【前言】 &#x1f33c;1. 打开Xshell软件 &#x1f33b;2. 安装Docker环境 ①&#xff1a;下载docker.sh脚本 ②&#xff1a;列出下载的内容 ③&#xff1a;执行一下get-docker.sh文件&#xff0c;安装docker ④&#xff1a;运行docker服务 ⑤&…

linux环境开发工具---yum与vim

1.Linux软件包管理器yum 1.1什么是软件包 在学习linux过程中&#xff0c;我们常常会遇到某些指令用不了的时候&#xff0c;原因除了权限问题外&#xff0c;还有可能是你当前的linux环境并没有安装相应的软件包。而在Linux下载安装软件的办法有两个&#xff0c;一个是先下载所需…

力扣1143. 最长公共子序列(动态规划)

Problem: 1143. 最长公共子序列 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 我们先假设已经将两个字符串转换为两个char类型的数组&#xff08;t1,t2&#xff09;便于比较 1.如果t1[i] t2[j],有三种决策&#xff1a;&#xff08;i1&#xff0c;j1&#xff09;&a…

微信小程序如何获取当前日期时间

Hello大家好&#xff01;我是咕噜铁蛋&#xff0c;获取当前日期时间是小程序中经常会用到的一个功能。因此&#xff0c;在本文中&#xff0c;我通过科技手段给大家收集整理了下&#xff0c;今天我将向大家介绍如何在微信小程序中获取当前日期时间的方法&#xff0c;并分享一些实…

【Unity】URP报错Object reference not set to an instance of an object

使用URP之后&#xff0c;Unity报错&#xff1a;显示不正常 NullReferenceException: Object reference not set to an instance of an object UnityEngine.Rendering.Universal.UniversalAdditionalCameraData.get_cameraStack () (at Library/PackageCache/com.unity.render-p…

VSCode 插件推荐

前言 关于开发用的插件就不做赘述了&#xff0c;网上面有很多文章都做了推荐&#xff0c;本文推荐几个好看的插件。 文件图标主题 Vscode icons Material Icon Theme 字体主题 推荐 One Dark Pro 其他 推荐一个生成好看代码的网址 https://carbon.now.sh/

Unity 抽象工厂模式(实例详解)

文章目录 简介实例1实例2 简介 抽象工厂模式是一种创建型设计模式&#xff0c;它提供了一种方式来封装一组相关或相互依赖对象的创建过程&#xff0c;而无需指定具体类。这种模式常用于系统中有多组相关产品族&#xff0c;且客户端需要使用不同产品族中的对象时。 在Unity中&a…

第一篇【传奇开心果系列】beeware的toga开发移动应用:轮盘抽奖移动应用

系列博文目录 beeware的toga开发移动应用示例系列博文目录一、项目目标二、开发传奇开心果轮盘抽奖安卓应用编程思路三、传奇开心果轮盘抽奖安卓应用示例代码四、补充抽奖逻辑实现五、开发传奇开心果轮盘抽奖苹果手机应用编程思路六、开发传奇开心果轮盘抽奖苹果手机应用示例代…

C#,最小生成树(MST)克鲁斯卡尔(Kruskal)算法的源代码

一、Kruskal算法简史 克鲁斯卡尔&#xff08;Kruskal&#xff09;算法是一种用来寻找最小生成树的算法&#xff0c;由Joseph Kruskal在1956年发表。用来解决同样问题的还有Prim算法和Boruvka算法等。三种算法都是贪婪算法的应用。和Boruvka算法不同的地方是&#xff0c;Kruska…

C++大学教程(第九版)6.38汉诺塔问题

文章目录 题目代码运行截图 题目 (汉诺塔问题)在这一章中大家了解了既可以用递归方法又可以用迭代方法很容易实现的函数。不过&#xff0c;在这道练习题中&#xff0c;我们提出的问题若用递归来解决&#xff0c;则尽显递归之优雅:若用迭代来实现&#xff0c;恐怕没那么容易。 …

深入Docker5:安装nginx部署完整项目

目录 准备 为什么要使用nginx mysql容器构建 1.删除容器 2.创建文件夹 3.上传配置文件 4.命令构建mysql容器 5.进入mysql容器&#xff0c;授予root所有权限 6.在mysql中用命令运行sql文件 7.创建指定数据库shop 8.执行指定的sql文件 nginx安装与部署 1.拉取镜像 2…

xxe漏洞之scms靶场漏洞

xxe-scms 代码审核 &#xff08;1&#xff09;全局搜索simplexml_load_string simplexml_load_string--将XML字符串解释为对象 &#xff08;2&#xff09;查看源代码 ID1 $GLOBALS[HTTP_RAW_POST_DATA]就相当于file_get_contents("php://input"); 因此这里就存…

性能优化-OpenCL运行时API介绍

「发表于知乎专栏《移动端算法优化》」 本文首先给出 OpenCL 运行时 API 的整体编程流程图&#xff0c;然后针对每一步介绍使用的运行时 API&#xff0c;讲解 API 参数&#xff0c;并给出编程运行实例。总结运行时 API 使用的注意事项。最后展示基于 OpenCL 的图像转置代码。在…