Git:Git中的分支管理

2023-10-27

本篇主要总结的是Git中的分支管理

分支是什么

在Git中,一个强大的功能就是分支

由前面的学习可以知道,当我们每次进行commit的时候,Git都会把这些commit的操作穿成一个时间线,而这个时间线就可以理解为是一个分支,在我们前面的操作中,只有一个时间线,换而言之,只有一个分支,这个分支就叫做主分支,也叫做master分支

上一篇在介绍Git的基本操作中讲到,Git中含有HEAD指针,可以借助它来完成对于版本的回退,这里再次明确概念,这个HEAD指针所指向的内容是master而不是具体的commit记录,而master所指向的内容才是提交的内容,也就是说,HEAD指向的是当前分支,而分支指向的是具体的master提交记录,用下面一张图来表示:

在这里插入图片描述
提交线上的每一个圆圈,代表的都是每一次提交,而master指向的是最新的一次提交,用户本身利用HEAD指针就可以通过master的指向回退或快进到某一个版本,随着不断提交,这个分支会不断变长,但只要HEAD一直指向的是master分支就可以指向当前的分支

下面通过一些实验来看上面的理论:

在这里插入图片描述
上图中使用了一些命令来查看当中的commit相关信息,从中可以看出每一次提交的信息都有记录,并且也会记录它的上一次提交的相关信息,依据这些信息都可以在这条master分支线中找到相应的信息

创建分支

既然分支是Git中的一大重要操作,那么创建多分支并使用多分支进行管理项目也是必不可少的操作,那么如何新建分支?

这里提供两个命令

# 查看本地所有分支
git branch
# 新建分支dev
git branch dev

在这里插入图片描述

其中,*表示的内容是,当前Git所控制的分支,以上图为例,当前HEAD所指向的分支其实是master,同时上面也表明了在Git中如何创建一个分支

下图表示了分支的存在证明:

在这里插入图片描述

在我们创建了分支后,此时的refs路径下heads所包含的内容就不仅仅是master了,换句话说,HEAD可以指向其他内容了

分支切换

在Git中提供了切换分支的操作:

# dev表示要切换的分支名称
git checkout dev

利用上面的命令,将Git的分支实现了切换,下图为实践图

在这里插入图片描述
而切换分支的操作,实际上就是将HEAD指针所指向的分支做修改的一个过程:

在这里插入图片描述
从上图中可能还有疑问,为什么dev创建后的分支默认是指向最新提交处?后面会进行实验证明

那么切换完分支后,就可以进行一些操作验证分支的特性了

在这里插入图片描述
从上图的实验中可以看出,在没有进行合并分支的前提下,在不同的分支下进行的commit操作是不可以互通的,都是单独的时间线,也就是单独的分支,从commit id的视角下观察这个结论

在这里插入图片描述

从上面的实验中可以几点:新建的分支确实是在当前所指分支的开始新建的,并且新建后的分支内容和旧的分支内容并不互通,也就是说,此时的状态可以用下面的状态图表示

在这里插入图片描述

合并分支

那么如何进行分支合并?Git中也提供了相关的命令:

# 要切换到master分支下
git merge dev

在这里插入图片描述
当在master分支下使用指令合并分支后,test中的内容就被合并到master中了,此时master就重新指向了最新的分支节点

在这里插入图片描述
Fast-forward代表快进模式,也就是直接把master指向dev的当前提交

删除分支

分支使用后要进行删除,避免占用过多资源:

git branch -d dev

在这里插入图片描述

此时就删除掉了分支:

在这里插入图片描述
那创建分支合并分支删除分支有什么作用?

Git建议使用分支后再删除,这样比较安全

合并冲突

看下面的场景:

在这里插入图片描述
上面所演示的过程就是合并冲突的原理,两个分支都进行了一些操作,此时想要进行合并Git不知道该如何合并,该合并哪个部分,因此Git给出的解决方案是两个版本都进行保留,由用户自己来决定如何管理

在这里插入图片描述
用下图来表示这个冲突的过程:

在这里插入图片描述
因此,当手动删除了部分内容后并进行提交,就可以解决这个冲突问题,此时就可以把状态转换为:

在这里插入图片描述
Git的可视化流程图

在Git命令中也是可以把上面的这个流程图进行可视化的,使用到的命令是git log

git log --graph --pretty=oneline --abbrev-commit

在这里插入图片描述

合并模式

merge的过程中,有两种合并模式,前面已经提到过一种合并模式是Fast-forward模式,这个模式的特点是直接将dev分支中的信息合并到master分支内,但如果这里我想在合并的这个过程也产生一次commit来表示,这里确实发生过一次merge该如何处理?Git中也提供了对应的命令选项:

# branch表示合并的分支名称
git merge --no-ff -m "merge with no-ff" [branch]

那么下面用实验来对比一下这两个方法合并模式对应的效果演示

首先看fast-forward模式

在这里插入图片描述

上面演示的就是fast-forward下的各项操作,下面演示no fast-forward的操作结果

在这里插入图片描述

从中可以看出,使用no-ff模式下的合并方法可以显示出merge的具体commit id等信息,这样有利于在追溯代码的时候找到在哪里产生问题等,在实际开发中也多建议使用no-ff模式而不是ff模式

在这里插入图片描述

分支策略

在实际开发中,进行分支管理应该要遵循下面的几个原则

  1. master版本是一个非常稳定的版本,这个分支是主分支,上面只是用来发布新的版本,在平时的开发过程中应该要自己创建分支,在自己的分支上完成操作
  2. 在自己的dev分支上完成自己的工作任务后,每个人都有自己的分支,完成后向master分支合并就可以了

因此整个合并的流程可以表示为下面的图

在这里插入图片描述

每个人都有自己的分支,分支写好后统一合并到master分支上,以确保master分支上都是稳定的代码

bug分支

现在有这样的场景,假设你正在dev的分支上进行开发,突然,master分支上发现了一个bug,现在这种修改master分支上的bug,应该如何解决?

在Git中,每一个bug都可以通过一个新的临时分支来进行修复,修复后合并分支,再将临时分支删除即可,但是对于上面的情况,dev的代码正在开发,但是master有问题,现在还无法提交,对于这种情况该如何解决?

在这里插入图片描述

针对这种情况,在Git中提供了一种叫做git stash的命令,这个命令的作用就是可以让当前的工作区的信息进行存储,在未来的某个时刻再把信息拿出来

git stash

在这里插入图片描述

使用该指令可以让工作区中的代码暂时存起来,因此使用stash指令查看就会发现此时工作区中是没有内容的,此时就可以单独拉一条fix_bug专用的分支进行修复代码,修复后的代码再提交到master分支内,此时master分支就是一个稳定的,没有bug的一份代码

那么下面就要解决的问题是,如何把我写了一半的代码和新的没有bug的代码合在一起

在这里插入图片描述
此时就完成了基本目标:既把master分支的bug改完了,又把dev分支下的内容更新完,并且dev下的内容是没有bug的,那么如何把dev的文件上传到master主线上?其实直接上传即可,但这里不推荐这样,原因如下:

原因是,解决合并冲突的时候,是由dev的用户自己进行手动的删除解决的,这当中可能会出现一些问题,因此这样的方法是有可能会出现错误的:

在这里插入图片描述

那么最标准的方法是,应该先拉取master上的代码与dev合并,在dev分支下看看能不能正常运行,如果可以再将代码整体合并到master分支上,以确保master分支上都是可跑的,没问题的代码

在这里插入图片描述

在这里插入图片描述

强制删除分支

Git默认的删除分支的前提是路径要进行合并后才能进行删除,但如果是没有进行合并,只是单纯想把路径删除?

Git中提供了对应的选项

# dev表示要删除的分支
git branch -D dev
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Git:Git中的分支管理 的相关文章

  • 致命:无法将 HEAD 解析为有效引用

    我正进入 状态fatal Failed to resolve HEAD as a valid ref 每当我尝试承诺时 我努力了 echo ref refs heads master gt git HEAD 但它不起作用 也尝试过 git
  • 在centos上设置jenkins:ssh密钥和git的问题

    经历了很多问题 但似乎没有什么能解决我的问题 或者更准确地说 我不确定我是否正确地完成了整个事情 所以这里是 已安装centos 6 3操作系统 然后我按照以下指南安装詹金斯 https wiki jenkins ci org displa
  • Git post-receive - 如何检查推送的分支是否与主分支合并

    在我们的团队中 我们通常将所有任务推送到单独的分支中 然后发布经理审查这些分支并将它们合并到 主 分支中 有时团队成员忘记将他们的分支与主分支合并 在推送之前 所以我想做的是 在用户推送后输出一条消息 请与主分支合并 我想我需要检查一些内容
  • 如何签出仅在“git ls-remote”中列出的分支?

    我遇到了无法切换到仅列出的分支的情况git ls remote 这是详细信息 我分叉了一个 github repoA 作为 repoB 创建了自己的分支并将其推送到 ComputerA 中的 repoB 在 ComputerB 中 我将分叉
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 为什么“git描述-dirty”在描述干净结帐时添加“-dirty”后缀?

    我刚刚发现 dirty选项git describe看起来它应该做一些非常有用的事情 即在输出中附加一个后缀git describe当工作树脏时 但是在我的一些存储库上似乎并非如此 git status On branch 8 30 noth
  • git-svn 如何知道要提交到哪个分支?

    我的存储库是 SVN 我使用 git 进行所有开发 我们有一个标准布局 我用以下命令初始化了我的本地存储库git svn init s
  • 在 Windows 上使用 Git - 意外丢失了大量工作。我可以拿回来吗?

    我很困惑 我想我已经失去了几个小时的工作时间 我之前在 Git 中编辑了一个文件 我保存了它 但没有提交 我确实做了一些其他文件更改 并提交并推送了它们 然而 有一个文件被搞乱了 所以我单击了最后一次成功的提交 然后按了 回滚到此提交 令我
  • 为别名命令添加“git help”?

    我已经实现了一个 Git 命令并使用 git 别名将其连接到 Git 但是有没有办法连接 Git 帮助 我在 Windows 上运行 如果我发出git help mycmd我收到一个弹出窗口 告诉我 Git 找不到 git mycmnd h
  • TortoiseGit - 更改默认合并消息

    系统描述 Windows 7的 git版本2 10 1 windows 1 乌龟Git 2 3 0 0 I want 合并提交消息在不同的情况下有所不同fully自动方式 no manual amend Summary 在windows上
  • 如何使用 git --word-diff 显示空格差异?

    为了说明问题 参见diff https github com nim lang Nim commit 47c7fd037ed28b7de3d120b003d059d30e18f128 diff split diff 8af935b2312d
  • 尝试配置 GIT 时 Eclipse 没有响应

    Windows 10 专业版 64 位SSD金士顿 i5 4690Eclipse 版本 全部工作空间 空问题 每次我尝试配置 TEAM gt GIT gt 配置或尝试导入 创建本地 远程 git 时 Eclipse 都会冻结 直到我强制用任
  • 合并 BPM 图表的最佳实践

    我们在 Java 环境中使用 Alfresco 活动图 这些图是有版本的 我们确实使用 GIT 我们经常会遇到合并分支的合并冲突 解决这个问题确实很痛苦 因为我们必须比较文件的文本内容来检查差异 有时 重新应用更改比合并更轻松 是否有合并此
  • 使用 GitHub,在添加现有存储库时如何推送所有分支?

    我创建了一个新的 GitHub 存储库 我想将现有的存储库放在那里 我按照说明操作 cd existing git repo git remote add origin email protected cdn cgi l email pro
  • Heroku 应用程序上的 Nodejs Express EACCES 0.0.0.0:80

    我正在尝试在他们的网站上新创建的 Heroku 应用程序上运行 Node 应用程序 我按照他们的步骤操作 但在显示应用程序状态时仍然遇到错误 我跟着Node js 入门 https devcenter heroku com articles
  • 检查 Git 中是否需要 pull

    如何检查远程存储库是否已更改并且需要拉取 现在我使用这个简单的脚本 git pull dry run grep q v Already up to date changed 1 但它比较重 有没有更好的办法 理想的解决方案是检查所有远程分支
  • 为什么cherry-pick 告诉我所有行都已更改?

    Updated 考虑文件 abc 在提交 A 和 B 中都相同 begin 123 456 789 klm end 在A中 我们重构第一行123 gt AAA并在结果之上选择 B Git 告诉我们all lines in the file
  • 合并后 Git 分支和提交历史记录

    我正在开发一个项目 单独 对于我开发的每个功能 我都会创建一个新分支 处理该功能 然后将其合并到 master 中 所以通常我不会同时在两个不同的分支上工作 也不会在一个分支上工作时接触master 当我合并一个分支时 我看到 使用gitx
  • Android repo 脚本创建的 .repo/projects/ 中的裸 git 存储库的用途是什么?

    The 安卓源码 http android git kernel org 由以下人员管理repo http source android com source version control html 使用 repo 同步时 一个名为 re
  • Git - 使用过滤器分支删除带有空变更集的提交

    如何使用 git filter branch 删除没有变更集的提交 我使用以下方法重写了我的 git 历史记录 git filter branch tree filter rm r f my folder f HEAD 效果很好 但现在我有

随机推荐

  • Spring学习(三)IOC控制反转与DI依赖注入

    IOC Inversion of Control 控制反转 是spring的核心 贯穿始终 所谓IOC 对于spring框架来说 就是由spring来负责控制对象的生命周期和对象间的关系 传统开发模式 对象之间互相依赖 IOC开发模式 IO
  • eclipse 项目提示"Project facet Java version 1.8 is not supported"

    今天使用eclipse 工具 导入maven 项目 编译项目的时候提示 Project facet Java version 1 8 is not supported 第一步 排查eclipse 项目的编译版本 项目 properties
  • Angular-官方文档学习-1

    Angular 简介 AngularJS 是一个 JavaScript 框架 它可通过 AngularJS 通过 指令 扩展了 HTML 且通过 表达式 绑定数据到 HTML AngularJS 扩展了 HTML AngularJS 通过
  • 选择文件窗口,获取选择文件地址

    微信公众号原文 系统 Windows 7 软件 Excel 2010 学习路径图 针对之前的学习路径图 会针对的写一些文章 我们在做信息处理的时候 可能会涉及到多个其它文件 有的时候需要根据需求选择所需文件进行处理 今天我们就讲讲如何使用V
  • 软件测试的基本概念

    目录 一 什么是需求 二 什么是测试用例 三 什么是BUG 四 开发模型和测试模型 1 软件开发生命周期 2 软件开发的五大模型 2 1 瀑布模型 2 2螺旋模型 2 3增量模型 迭代模型 2 4 敏捷模型 3 软件测试的两大模型 3 1
  • 一个登录案例学会 Pinia

    Pinia 号称下一代的 Vuex 经过初步体验 发现相比于 Vuex Pinia 确实有了很大进步 最明显的就是删减了复杂的概念 简化了数据流转的过程 现在只剩下了 store state getters actions 这四个核心概念
  • 小白学习python——numpy

    零 初识numpy 1 numPy Numerical Python 即数值Python包 是Python进行科学计算的一个基础包 所以是一个掌握其他Scipy库中模块的基础模块 一定需要先掌握该包的主要使用方式 官网 http www n
  • 猿创征文

    内存管理实现单链表的插入和删除 1 收获 2 什么是单链表 3 节点的创建 4 主函数的实现 5 子函数的实现 5 1 AollocNode的实现 5 2 HeadInsertNode的实现 5 3 ShowNode的实现 5 4 Head
  • KB2871997补丁绕过

    KB2871997补丁绕过 微软为了防止用户的明文密码在内存中泄露 发布了KB2871997补丁 关闭了Wdigest功能 Windows Server2012及以上版本默认关闭Wdigest 使攻击者无法从内存中获取明文密码 Window
  • 24. 两两交换链表中的节点

    给你一个链表 两两交换其中相邻的节点 并返回交换后链表的头节点 你必须在不修改节点内部的值的情况下完成本题 即 只能进行节点交换 输入 head 1 2 3 4 输出 2 1 4 3 示例 2 输入 head 输出 示例 3 输入 head
  • php 验证只能输入姓名,php 检查输入用户名是否符合规定示例

    这篇文章主要为大家详细介绍了php 检查输入用户名是否符合规定示例 具有一定的参考价值 可以用来参考一下 对php检查输入的用户名是否符合规定感兴趣的小伙伴 下面一起跟随512笔记的小编两巴掌来看看吧 php检查输入的用户名是否符合规定 p
  • 【热门框架】Mybatis-Plus条件查询的三种格式

    Mybatis Plus 提供了三种常用的条件查询方式 分别是 Wrapper QueryWrapper LambdaQueryWrapper Wrapper Wrapper 是一个接口 提供了若干个构造方法 可以用来构建 where 条件
  • C++可变参数模板

    可变参数模板 接受可变数目参数的模板函数或模板类 将可变数目的参数成为参数包 有模板参数包和函数参数包 模板参数包 表示零个或多个模板参数 函数参数包 表示零个或多个函数参数 例如 template
  • 数据挖掘note(1)

    数据挖掘一般分为机器学习和统计学习 大数据学的课程一般是关于机器学习 我们学的浅 主要关于统计学习 示意图如下所示 这是一个大数据时代 但是数据挖掘的利用率不足0 5 可见数据挖掘的空间巨大 问题 数据挖掘对信息安全有什么用 例如从几十万条
  • VTM2.0+360lib-7.0配置环境

    全景视频编码跟普通的视频编码不一样 在VTM平台下还需要配置一个360lib 这里贴一下VTM和360lib的地址 VTM下载地址 360lib下载地址 提示一下 VTM可以直接在网站上下载zip版本 360lib要svn的方法下载 下载下
  • 戏开发unity编译和调试系列:The type or namespace name ‘NativeList<>‘ could not be found

    The type or namespace name NativeList lt gt could not be found are you missing a using directive or an assembly referenc
  • intellij idea如何将基于Springboot的web项目打成war包

    intellij idea如何将基于Springboot的web项目打成war包 详细内容请参看 https ms200 cn p 791
  • flink接入Kafka报错:timeout expired while fetching topic metadata

    简单的flink接入kafka结果报错 代码 create env val env StreamExecutionEnvironment getExecutionEnvironment set parallelism env setPara
  • 测试员不可不知的几款bug管理工具

    根据每个公司性质的不同 规模的不同 所用到的bug管理工具也可能不同 你们用的bug管理工具是什么呢 下面介绍几款主流的bug管理工具 1 JIRA 付费 JIRA JIRA的生产者把JIRA定义为Professional Issue Tr
  • Git:Git中的分支管理

    文章目录 分支是什么 创建分支 分支切换 合并分支 删除分支 合并冲突 合并模式 分支策略 bug分支 强制删除分支 本篇主要总结的是Git中的分支管理 分支是什么 在Git中 一个强大的功能就是分支 由前面的学习可以知道 当我们每次进行c