深入理解 Git 分支操作的底层原理
在软件开发的世界里,Git 已经成为了版本控制的标配工具。而 Git 分支功能,更是极大地提升了团队协作和项目开发的效率。我们在日常开发中频繁地创建、切换和合并分支,但是这些操作背后的底层原理是怎样的呢?在之前的博客探秘Git底层原理中介绍了git最基础命令的底层原理,接下来,我们继续深入学习Git 分支操作的底层原理
一、Git 分支的本质:轻量级指针
在 Git 中,分支实际上就是一个轻量级的指针,它指向一个特定的 Commit 对象。默认情况下,Git 仓库会有一个名为 master
(现在很多仓库默认是 main
)的分支,它指向项目的初始提交
1.1 分支的创建
当我们使用 git branch <branch-name>
命令创建一个新分支时,Git 只是简单地在 .git/refs/heads
目录下创建了一个新的文件,文件名为分支名,文件内容就是当前分支所指向的 Commit 对象的哈希值。由此看在git中新建分支的开销是十分小的,它只是创建了一个指向commit的指针,但是效果却是十分重要的,我们可以在不影响之前分支的前提下对现有代码做修改。(集中式版本控制系统svn每次创建分支会将之前的代码重新复制一遍,开销很大) 例如,执行 git branch feature
命令后,.git/refs/heads
目录下会出现一个名为 feature
的文件,其内容和 master
分支指向的 Commit 哈希值相同。这意味着 feature
分支和 master
分支在创建时指向同一个 Commit 对象。
1.2 分支的切换
使用 git checkout <branch-name>
或 git switch <branch-name>
命令可以切换分支。当我们切换分支时,Git 会更新 HEAD 指针,使其指向新分支的引用文件。HEAD 指针是一个特殊的引用,它始终指向当前所在的分支。例如,当我们从 master
分支切换到 feature
分支时,HEAD 指针会从 .git/refs/heads/master
指向 .git/refs/heads/feature
。此时,工作目录的内容会更新为新分支所指向的 Commit 对象对应的项目状态。
1.3 分支的移动
当我们在某个分支上进行新的提交时,该分支的指针会自动向前移动,指向新的 Commit 对象。例如,在 feature
分支上进行了一次提交,feature
分支对应的引用文件(.git/refs/heads/feature
)中的哈希值会更新为新 Commit 对象的哈希值,而 master
分支的指针不会受到影响。这就是 Git 能够支持并行开发的关键,不同的分支可以独立发展,互不干扰。
二.分支引用
了解了分支的原理后我们可以打开git仓库找到分支的引用,相关目录在.git/refs/heads
中。这部分我们通过实操了解git分支的机制
我们先初始化一个仓库,init之后.git/refs/heads
文件夹中为空。
这里我们先在一个初始化过的仓库新建并编辑一个文件1.txt
,然后进行第一次提交,这时查看文件夹中内容,此时有一个对应的master文件,用记事本打开文件内容
里面是如图的哈希值,对照git中的提交值,这正是第一次commit后的对象id,说明分支中保存的就是指向的commit的id
下面我们再重建一个分支,此时文件夹中也对应生成了该分支引用。
后面我们添加1.txt内容并保存,再切回master分支并进行合并,可以看到,合并后两个分支都指向最新的提交,内容也都存的最新提交的哈希值
二、分支的合并:快进模式和冲突处理
在开发过程中,我们经常需要将一个分支的修改合并到另一个分支中。Git 提供了两种主要的合并方式:快进合并和三方合并。
2.1 快进合并
当一个分支是另一个分支的直接下游,即没有分叉时,Git 会使用快进合并。例如,feature
分支是从 master
分支创建的,并且在 feature
分支上进行了一系列提交,而 master
分支没有任何新的提交。此时,当我们将 feature
分支合并到 master
分支时,Git 只需要将 master
分支的指针直接移动到 feature
分支所指向的 Commit 对象即可。这种合并方式非常简单和高效,不会产生新的 Commit 对象。
2.2 三方合并(冲突处理)
当两个分支有不同的提交历史,即发生了分叉时,Git 会使用三方合并。三方合并需要找到两个分支的共同祖先 Commit 对象(合并基础),以及两个分支各自的最新 Commit 对象。Git 会将这三个 Commit 对象对应的 Tree 对象进行比较和合并,生成一个新的 Commit 对象,该 Commit 对象有两个父 Commit 对象,分别指向合并前的两个分支的最新 Commit 对象。这个新的 Commit 对象代表了合并后的项目状态。
三、删除分支:清理不再需要的引用
当一个分支的开发任务完成并且已经合并到主分支后,我们可以使用 git branch -d <branch-name>
命令删除该分支。删除分支实际上就是删除 .git/refs/heads
目录下对应的引用文件。需要注意的是,如果分支上有未合并的提交,使用 -d
选项删除分支会失败,此时可以使用 -D
选项强制删除。
四、总结
Git 分支操作的底层原理基于其强大的对象存储和引用管理机制。通过轻量级的分支指针,Git 能够高效地支持并行开发,让团队成员可以在不同的分支上独立工作。而合并操作则允许我们将不同分支的修改整合到一起,确保项目的顺利推进。深入理解 Git 分支操作的底层原理,不仅可以帮助我们更好地使用 Git 进行版本控制,还能在遇到复杂的分支问题时,快速定位和解决问题。
相关文章:

深入理解 Git 分支操作的底层原理
在软件开发的世界里,Git 已经成为了版本控制的标配工具。而 Git 分支功能,更是极大地提升了团队协作和项目开发的效率。我们在日常开发中频繁地创建、切换和合并分支,但是这些操作背后的底层原理是怎样的呢?在之前的博客探秘Git底…...

Excel MCP: 自动读取、提炼、分析Excel数据并生成可视化图表和分析报告
最近,一款Excel MCP Server的开源工具火了,看起来功能很强大,咱们今天来一探究竟。 基础环境 最近两年,大家都可以看到AI的发展有多快,我国超10亿参数的大模型,在短短一年之内,已经超过了100个&…...

C语言:深入理解指针(4)
目录 一、字符指针变量 二、数组指针变量 三、二维数组传参的本质 四、函数指针变量 五、typedef 类型重命名 六、函数指针数组 一、字符指针变量 我们常见的字符指针变量是这样的: char a w; char* p &a; char arr[] "abcd"; char* pa ar…...
Gensim 是一个专为 Python 设计的开源库
Gensim 是一个专为 Python 设计的开源库,其核心代码和生态系统均基于 Python 构建,目前官方仅支持 Python 语言。如果你需要在其他编程语言中实现类似功能(如词向量训练、主题模型等),通常需要使用对应语言的替代库或通…...
质量管理工程师面试总结
今天闲着无聊参加了学校招聘会的一家双选会企业,以下是面试的过程。 此次面试采用的是一对多的形式。(此次三个求职者,一个面试官) 面试官:开始你们每个人先做个自我介绍吧。 哈哈哈哈哈哈哈哈,其实我们…...
python 爬虫框架介绍
文章目录 前言一、Requests BeautifulSoup(基础组合)二、Scrapy(高级框架)三、PySpider(可视化爬虫)四、Selenium(浏览器自动化)五、Playwright(新一代浏览器自动化&…...
window 显示驱动开发-使用有保证的协定 DMA 缓冲区模型
Windows Vista 的显示驱动程序模型保证呈现设备的 DMA 缓冲区和修补程序位置列表的大小。 修补程序位置列表包含 DMA 缓冲区中命令引用的资源的物理内存地址。 在有保证的协定模式下,用户模式显示驱动程序知道 DMA 缓冲区和修补程序位置列表的确切大小,…...
蓝牙协议架构与调试工具详解(含 BLE、HCI 命令、调试命令)
本文介绍蓝牙协议从物理层到应用层的完整通信流程,并详解了 Linux 下主流蓝牙调试工具的使用方法,适用于嵌入式蓝牙驱动开发、BLE调试、通信协议分析等场景。 🔧 1. 蓝牙架构概览 ✅ 芯片架构 单模芯片:仅支持 BLE 或 Classic 蓝…...
预测模型开发与评估:基于机器学习的数据分析实践
在当今数据驱动的时代,预测模型已成为各行各业决策制定的核心工具。本文将分享我在COMP5310课程项目中开发预测模型的经验,探讨从数据清洗到模型优化的完整过程,并提供详细的技术实现代码。 ## 研究问题与数据集 ### 研究问题 我们的研究聚焦…...
提高表达能力
你遇到的这种情况其实很常见,背后的原因可能涉及思维模式、心理状态和表达习惯的综合作用。以下是具体分析和解决方案: 1. 原因分析:为什么讨论时流畅,独自表达却卡壳? 外部反馈缺失:讨论时对方的提问、反…...

【更新】全国省市县-公开手机基站数据集(2006-2025.3)
手机基站是现代通信网络中的重要组成部分,它们为广泛的通信服务提供基础设施。随着数字化进程的不断推进,手机基站的建设与布局对优化网络质量和提升通信服务水平起着至关重要的作用,本分享数据可帮助分析移动通信网络的发展和优化。本次数据…...

基于MNIST数据集的手写数字识别(CNN)
目录 一,模型训练 1.1 数据集介绍 1.2 CNN模型层结构 1.3 定义CNN模型 1.4 神经网络的前向传播过程 1.5 数据预处理 1.6 加载数据 1.7 初始化 1.8 模型训练过程 1.9 保存模型 二,模型测试 2.1 定义与训练时相同的CNN模型架构 2.2 图像的预处…...
MYSQL创建索引的原则
创建索引的原则包括: 表中的数据量超过10万以上时考虑创建索引。 选择查询频繁的字段作为索引,如查询条件、排序字段或分组字段。 尽量使用复合索引,覆盖SQL的返回值。 如果字段区分度不高,可以将其放在组合索引的后面。 对于…...
运行Spark程序-在shell中运行
Spark Shell运行程序步骤 启动Spark Shell 根据语言选择启动命令: Scala版本(默认):执行spark-shellPython版本:执行pyspark 数据加载示例 读取本地文本文件: // Scala版本 val textData sc.textFile(…...

idea Maven 打包SpringBoot可执行的jar包
背景:当我们需要坐联调测试的时候,需要对接前端同事,则需要打包成jar包直接运行启动服务 需要将项目中的pom文件增加如下代码配置: <build><plugins><plugin><groupId>org.springframework.boot</gr…...

HarmonyOs开发之——— ArkWeb 实战指南
HarmonyOs开发之——— ArkWeb 实战指南 谢谢关注!! 前言:上一篇文章主要介绍HarmonyOs开发之———合理使用动画与转场:CSDN 博客链接 一、ArkWeb 组件基础与生命周期管理 1.1 Web 组件核心能力概述 ArkWeb 的Web组件支持加载本地或在线网页,提供完整的生命周期回调体…...

国标GB/T 12536-90滑行试验全解析:纯电动轻卡行驶阻力模型参数精准标定
摘要 本文以国标GB/T 12536-90为核心框架,深度解析纯电动轻卡滑行试验的完整流程与数据建模方法,提供: 法规级试验规范:从环境要求到数据采集全流程详解行驶阻力模型精准标定:最小二乘法求解 ( FAv^2BvC ) 的MATLAB实…...

初识——QT
QT安装方法 一、项目创建流程 创建项目 入口:通过Qt Creator的欢迎页面或菜单栏(文件→新建项目)创建新项目。 项目类型:选择「Qt Widgets Application」。 路径要求:项目路径需为纯英文且不含特殊字符。 构建系统…...
几何_平面方程表示_点+向量形式
三维平面方程可以写成: π : n ⊤ X d 0 \boxed{\pi: \mathbf{n}^\top \mathbf{X} d 0} π:n⊤Xd0 📐 一、几何直观解释 ✅ 平面是“法向量 平面上一点”定义的集合 一个平面可以由: 一个单位法向量 n ∈ R 3 \mathbf{n} \in \mat…...
学习alpha
(sign(ts_delta(volume, 1)) * (-1 * ts_delta(close, 1))) 这个先用sign操作符 sign.如果输入NaN则返回NaN 在金融领域,符号函数 sign(x) 与 “基础”(Base)的组合概念可结合具体场景解读,以下从不同金融场景分析其潜在意义&…...
Java - Junit框架
单元测试:针对最小的功能单元(方法),编写测试代码对该功能进行正确性测试。 Junit:Java语言实现的单元测试框架,很多开发工具已经集成了Junit框架,如IDEA。 优点 编写的测试代码很灵活,可以指某个测试方法…...
秒删node_modules[无废话版]
“npm install”命令带来的便利和高效让人感到畅快,但删除依赖包时却可能带来诸多困扰。特别是在项目依赖关系较为复杂的情况下,node_modules文件夹的体积往往会膨胀至数百MB甚至几个GB,手动删除时进度条长时间转圈,令人感到焦虑和…...

kkFileView文件文档在线预览镜像分享
kkFileView为文件文档在线预览解决方案,该项目使用流行的spring boot搭建,易上手和部署,基本支持主流办公文档的在线预览,如doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频等等 开源项目地址 https://gitee.com/kek…...

实例分割AI数据标注 ISAT自动标注工具使用方法
文章目录 🌕ISAT安装和启动方法🌕下载和使用AI分割模型🌙SAM模型性能排行🌙手动下载sam模型 & sam模型下载路径🌕使用方法🌙从file中导入图片🌙点击左上角的图标进入分割模式🌙鼠标左键点击画面中的人则自动标注🌙点击右键该区域不标注🌙一个人一个人的…...

Qt图表绘制(QtCharts)- 性能优化(13)
文章目录 1 批量替换代替追加1.1 测试11.2 测试21.3 测试3 2 开启OpenGL2.1 测试12.2 测试22.3 测试32.4 测试4 更多精彩内容👉内容导航 👈👉Qt开发 👈👉QtCharts绘图 👈👉python开发 …...
Spring Cloud动态配置刷新:@RefreshScope与@Component的协同机制解析
在微服务架构中,动态配置管理是实现服务灵活部署、快速响应业务变化的关键能力之一。Spring Cloud 提供了基于 RefreshScope 和 Component 的动态配置刷新机制,使得开发者可以在不重启服务的情况下更新配置。 本文将深入解析 RefreshScope 与 Component…...
部署docker上的redis,idea一直显示Failed to connect to any host resolved for DNS name
参考了https://blog.csdn.net/m0_74216612/article/details/144145127 这篇文章,关闭了centos的防火墙,也修改了redis.conf文件,还是一直显示Failed to connect to any host resolved for DNS name。最终发现是腾讯云服务器那一层防火墙没…...

如何在 Windows 10 或 11 上使用命令提示符安装 PHP
我们可以在 Windows 上从其官方网站下载并安装 PHP 的可执行文件,但使用命令提示符或 PowerShell 更方便。 PHP 并不是一种新的或不为人知的脚本语言,它已经存在并被全球数千名网络开发人员使用。它以开源许可并分发,广泛用于 LAMP 堆栈中。然而,与 Linux 相比,它在 Wind…...

RK3588 ADB使用
安卓adb操作介绍 adb(Android Debug Bridge)是一个用于与安卓设备进行通信和控制的工具。adb可以通过USB或无线网络连接安卓设备,执行各种命令,如安装和卸载应用,传输文件,查看日志,运行shell命…...
Vue 3.0双向数据绑定实现原理
Vue3 的数据双向绑定是通过响应式系统来实现的。相比于 Vue2,Vue3 在响应式系统上做了很多改进,主要使用了 Proxy 对象来替代原来的 Object.defineProperty。本文将介绍 Vue3 数据双向绑定的主要特点和实现方式。 1. 响应式系统 1.1. Proxy对象 Vue3 …...