Git 分支详解

news/2024/10/11 19:53:11/文章来源:https://blog.csdn.net/weixin_64874291/article/details/134513771

目录

1. Git 分支管理

2. 如何自己创建分支?   

3. 创建分支修改内容,之后合并到主分支

4. 删除分支

5. 出现 merge 冲突如何解决

6. 分支策略

前言

    之前只是知道有 master 分支这个东西,但是具体是啥意思还是不知道,今天详细总结一下。

如下图所示:这个时间线就是 master 主分支,HEAD就是指针,是指向 master 的,所以就通过HEAD 找到 master,通过 master 找到最后一次的提交,此时这条时间线就可以理解为是一个分支。

    除了主分支之外,它也是可以创建一些其他的分支的,

       下图所示:git 也是支持创建分支和合并分支的。

 1. Git 分支管理

    在创建第一个分支之前,是需要看下当前 Git 中有哪些分支;使用 git branch 命令;如下图所示:

    只有一个 master 分支,当Git创建出来仓库之后,默认的就是这个 master 分支, 此时可以回想上文中介绍的 HEAD,HEAD 指针不只是可以指向 master 分支的,还可以指向任何的分支,被 HEAD指向的分支才是当前我们工作的分支, 所以 HEAD 的作用:HEAD 指向那个分支,哪个分支就是工作分支。

2. 如何自己创建分支?
   

     使用 命令:git branch [分支名称]

    创建好之后还是用 git branch 命令来查看当前有哪些分支,如下图所示:

    也可使用 tree .git/ 来查看当前 Git 中的树状结构:

    然后查看 master 和 dev 分支下都有什么,可以看到当前 master 和 dev 都是指向最新的一次的提交的,下图所示:

    下图就是树状结构图的直观体现,dev 分支也是指向 最新的一次提交的原因:在创建 dev 分支的时候就是站在当前版本的最新的提交基础上创建的分支。

  3. 创建分支修改内容,之后合并到主分支

    如果此时我们想在 新创建的 dev分支来进行 add 和 commit 操作,需要先将工作分支切换到 dev 分支才可以,可以使用 git checkout dev,(之前的 checkout -- ... 的意思是撤销工作区中修改的内容)

    修改 dev 分支作为工作分支之后,此时就可以在 dev 分支修改文件了,随便做一个修改之后,如下图所示:

     在 dev 这个工作分支修改内容之后,进行一次 commit 提交,之后切换分支到 master 为工作分支,可以看到,两次的最新提交记录并不是一样的,如下图所示:

    其实在工作分支进行提交之后,是并不会影响其他分支的,dev 分支提交的是最新的一次改动,但是 master 分支还在指向上一次的改动,我们可以使用 git merge dev 来将 dev 分支改动的内容提交到 master 主线上来,前提是将工作分支切换到 master 分支上,合并之后的内容就是一样的了;如下图所示:

    其实上述所描述的就是 创建一个 dev 分支,在 dev 分支上修改了 ReadMe 文件,修改之后再将dev 分支修改的内容合并到 master 主线上。(master分支就是一个创建git仓库之后默认就有的主线),一旦合并之后,dev 的使命也就结束了,对于 dev 分支来说,不用了就需要将删掉,为了不占用资源。

  4. 删除分支

    注:首先要删除一个分支,需要在其他分支上来进行删除,如:要删除 dev 分支不能只在 dev 分支上删除 dev 分支,可以在 master 分支上删除 dev 分支。

     如下图所示:如果当前分支是工作分支,是不能对这个 工作分支进行删除的。

    只能在当前工作分支,来删除其他的工作分支,(但是删除 dev 分支之后并不会影响 master 分支指向的最新的一次提交)如下图所示:

    master 分支还是指向的 dev 最新一次修改的提交:

     Git 是鼓励创建分支来修改 master 主线上的内容的,因为这个过程很轻量,直接更换的就是HEAD指针,虽然也可以在 master 主线上对文件的内容进行修改,但是 创建 dev 分支修改然后进行合并的这种方式,过程是更安全的。

  5. 出现 merge 冲突如何解决

    首先介绍一下什么是 merge 冲突,如:现在提出了一个新需求来进行开发一个新功能,所以此时就需要创建一个新的 dev 分支,现在正在 dev 分支进行开发呢,但是 master 分支上突然出现了一个 bug(master 分支上的代码也不是完全稳定的,只是相对来说稳定),所以就要修改 master 分支上的代码,不一会,dev 的代码写好了,然后 master 分支的 bug 也改好了,此时要进行合并了,但是dev分支一个版本,master 分支一个版本,此时应该merge保留的是哪个版本的代码呢,此时出现的情况就叫代码 merge 冲突,Git 是不会替开发人员做决定来保留哪个版本的代码的,所以需要开发人员来自己解决,解决的方法手动修改代码,然后进行 add 和 commit 操作即可。

    来模拟一下这个流程,创建一个 dev 分支,并切换到 dev 分支,还是修改 ReadMe 文件,如下图所示:

     解决 merge 冲突之前就是如下图所示的这个状态:

     上图所示的过程就是手动解决 merge 冲突的方法。

     还有一个命令 就是 git stash,这个意思就是将当前工作分支没有 commit 的文件进行保存,保存当前的工作进度,应用场景就是:在进行代码开发时,希望临时保存当前的工作进度,包括已暂存和未暂存的修改,然后去处理其他分支的任务,但是需要注意的是,前提是这个文件已经交给 Git 托管了,此时才能进行 stash,如下图所示:

     但是如果新建一个文件,这个文件还没有进行过 add 和 commit 操作,此时这个文件就是没有被 Git 管理的,就不能进行保存,ReadMe 文件可以 stash 就是因为这个文件已经托管到 Git中了如下图所示:

  6. 分支策略

     上图所示:右边 master 主分支跑的代码是稳定的代码,所以 master 分支跑的代码是非常稳定的,次啊可以保证线上环境是稳定的,除了 master 分支,还有日常进行开发的主分支的 dev 分支,dev 分支上的代码是不稳定的,这个环境是没有经过验证测试的分支。

     但是 master 分支也不是绝对稳定的代码,当 master 分支出现了 bug ,开发人员是不可以进行bug 的 fix 的,应该先创建一个本地分支,之后再进行 bug 的 fix,修复完成之后要进行一系列的测试,之后才可以 merge 到 master 主分支,如果直接在 master 主分支上进行修改,可能在改代码的过程中就出现更大的 bug,可能线上的环境就会更加不稳定。

      如现在有这样的一个场景,正在 dev2 分支上进行开发,之后突然在 master 分支上出现了一个bug,此时开发人员该如何解决呢?

      首先 git stash dev2 分支的代码(保存当前的工作进度),之后切换到 master 分支上创建 fix bug 的分支,当然也可以在 dev2 分支上进行 fix,但 dev2 的初衷是开发新需求,而不是修改bug,所以最好创建一个新的分支:

     上图所示:现在的状态是已经 fix bug 了,也已经 merge 到 master 分支上了,但是此时还需要回到 dev2 进行新需求的开发,下图所示:

     但是此时 dev2 分支的代码不见了,就是因为刚才fix bug 之前使用了 git stash,所以切换回来 dev2 分支后,还需要将 stash 区保存的内容拿出来,使用 git stash pop命令,在操作之前可以使用 git stash list 命令来查看 stash 区中保存的是哪一次的内容:

     此时就可以看到我们的开发到一半的代码了,但是此时可以看到 dev2 分支的状态还是没有修复bug 的版本,原因就是 dev2 的创建就是在 master 分支提交bug之后这个版本的基础上创建出来的,但是此时 dev2 分支也不会影响 master 分支,因为 master 主分支已经 fix bug了。

     当在 dev2 分支上开发完新的需求之后,此时就可以将 dev2 分支的功能合并到 master 主分支上了,但是 master 分支在 fix bug 时候也已经改了内容了,所以此时进行合并一定是会 merge 冲突的,有了冲突就要解决冲突,解决冲突就需要手动改动代码,手动改就有可能出现 bug,所以是不建议在 master 分支中进行merge 冲突的解决的,此时一个比较好的做法就是将 master 分支中的代码 merge 到 dev2 分支上来,此时即使改出来新的 bug,也不会影响 master 主分支中的内容,所以可以按照下图所示进行操作:

   

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

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

相关文章

变量和引用

变量和引用 2.1.深入认识变量 2.1.1.什么是变量 变量是在程序中保存用户数据的一段内存存储空间,变量名是内存空间的首地址 变量三要素:名称、类型、值 2.1.2.变量的名称 组成: 字母、数字、下划线组成,不能以数字开头 变量名称的长…

分布式事务有哪些解决方案?

本文我们来讨论下分布式事务的相关知识点。 分布式事务是分布式系统中非常重要的一部分,最典型的例子是银行转账和扣款,A 和 B 的账户信息在不同的服务器上,A 给 B 转账 100 元,要完成这个操作,需要两个步骤&#xff0…

【WinForm.NET开发】创建 Windows 窗体应用

本文内容 创建项目创建应用程序运行应用程序 本文演示创建一个具有基于 Windows 的用户界面 (UI) 的简单 C# 应用程序。 1、创建项目 首先,创建 C# 应用程序项目。 项目类型随附了所需的全部模板文件,无需添加任何内容。 打开 Visual Studio。在“开…

buuctf [极客大挑战 2019]Havefun1

解题思路: 小习惯 本题先看看源码或者检查一下,可能这是俺的一个小习惯。 源码里面都看到了php的代码 php代码解析: $cat$_GET[cat]; echo $cat; if($catdog){ echo Syc{cat_cat_cat_cat}; } 1.$ca…

服务器数据恢复—V7000存储raid5崩溃导致上层卷无法使用的数据恢复案例

服务器数据恢复环境: 某品牌V7000存储中有一组由几十块硬盘组建的raid5阵列。上层操作系统为windows server,NTFS分区。 服务器故障: 有一块硬盘出现故障离线,热备盘自动上线替换离线硬盘。在热备盘上线同步数据的过程&#xff0c…

Java Web——动态Web开发核心-Servlet

目录 1. 官方文档 2. Servlet概述 3. Servlet基本使用 3.1. 浏览器调用Servlet的流程 3.2. Servlet生命周期 3.3. Get/Post请求的分发处理 4. Servlet继承结构 5. 继承HttpServlet开发Servlet 5.1. HttpServlet介绍 5.2. 使用相关代码测试 5.3. HttpServletRequest …

6-49.自定义的学生类

本题要求定义一个简单的学生类,数据成员仅需要定义学号和姓名,函数成员的原型见给出的代码,请给出函数成员的类外完整实现。 其中m_id和m_name分别表示学生的学号和姓名,类型已经定义好。类内声明了3个成员函数,分别表…

ZooKeeper 如何保证数据一致性?

在分布式场景中,ZooKeeper 的应用非常广泛,比如数据发布和订阅、命名服务、配置中心、注册中心、分布式锁等。 ZooKeeper 提供了一个类似于 Linux 文件系统的数据模型,和基于 Watcher 机制的分布式事件通知,这些特性都依赖 ZooKee…

手机爬虫用Fiddler详细教程

如果你正在进行手机爬虫的工作,那么一款强大而又实用的网络调试工具Fiddler将会是你的好帮手。今天,我将和大家分享一份详细的Fiddler教程,教你如何使用它来轻松捕获和分析手机App的网络请求。让我们一起来探索Fiddler的功能和操作&#xff0…

JDK中lock锁的机制,其底层是一种无锁的架构实现的,公平锁和非公平锁

简述JDK中lock锁的机制,其底层是一种无锁的架构实现的,是否知道其是如何实现的 synchronized与lock lock是一个接口,而synchronized是在JVM层面实现的。synchronized释放锁有两种方式: 获取锁的线程执行完同步代码,…

十大经典系统架构设计面试题

十大经典系统架构设计面试题_架构_程序员石磊_InfoQ写作社区翻译自:https://medium.com/geekculture/top-10-system-design-interview-questions-10f7b5ea123d在我作为微软和Facebhttps://xie.infoq.cn/article/4c0c9328a725a76922f6547ad 任何 SDI 问题的提示 通过…

Linux基础项目开发1:量产工具——输入系统(三)

前言: 前面我们已经实现了显示系统,现在我们来实现输入系统,与显示系统类似,下面让我们一起来对输入系统进行学习搭建吧 目录 一、数据结构抽象 1. 数据本身 2. 设备本身: 3. input_manager.h 二、触摸屏编程 t…

Java(十)(网络编程,UDP,TCP)

目录 网络编程 两种软件架构 网络通信的三要素 IP IPv4的地址分类 特殊IP 端口号 协议 用UDP协议发送数据 用UDP接收数据 TCP接收和发送数据 TCP通信--支持与多个客户端同时通信 网络编程 可以让设备中的程序与网络上其他设备的程序进行数据交互(实现网络通信) 两…

ganache部署智能合约报错VM Exception while processing transaction: invalid opcode

这是因为编译的字节码不正确,ganache和remix编译时需要选择相同的evm version 如下图所示: remix: ganache: 确保两者都选择london或者其他evm,只要确保EVM一致就可以正确编译并部署, 不会再出现VM Exception while processing…

山西电力市场日前价格预测【2023-12-04】

日前价格预测 预测说明: 如上图所示,预测明日(2023-12-04)山西电力市场全天平均日前电价为179.48元/MWh。其中,最高日前电价为362.01元/MWh,预计出现在18:00。最低日前电价为0.00元/MWh,预计出…

rdf-file:SM2加解密

一:SM2简介 SM2是中国密码学算法标准中的一种非对称加密算法(包括公钥和私钥)。SM2主要用于数字签名、密钥交换和加密解密等密码学。 生成秘钥:用于生成一对公钥和私钥。公钥:用于加密数据和验证数字签名。私钥&…

免费WordPress站群插件-批量管理站群的免费软件

WordPress站群插件:让文章管理如丝般顺滑 在众多网站建设工具中,WordPress一直以其简便易用、丰富的插件生态而备受青睐。对于站群管理者而言,如何高效地更新、发布和推送文章是一项不可忽视的任务。本文将专注分享一款WordPress站群插件&am…

解读Java虚拟机垃圾回收器:探究经典算法背后的奥秘

目录 一、GC分类与性能指标 (一)垃圾回收器分类 (二)性能指标 (三)不可能三角 二、不同的垃圾回收器概述 三、Serial回收器:串行回收 四、ParNew回收器:并行回收 五、Parall…

【探索Linux】—— 强大的命令行工具 P.18(进程信号 —— 信号捕捉 | 信号处理 | sigaction() )

阅读导航 引言一、信号捕捉1. 内核实现信号捕捉过程2. sigaction() 函数(1)函数原型(2)参数说明(3)返回值(4)函数使用 二、可重入函数与不可重入函数1. 可重入函数条件2. 不可重入函…

[英语学习][5][Word Power Made Easy]的精读与翻译优化

[序言] 今日完成第18页的阅读, 发现大量的翻译错误以及不准确. 需要分两篇文章进行讲解. [英文学习的目标] 提升自身的英语水平, 对日后编程技能的提升有很大帮助. 希望大家这次能学到东西, 同时加入我的社区讨论与交流英语相关的内容. [原著英文与翻译版对照][第18页] Wh…