深入理解 Git 分支操作的底层原理

news2025/7/19 11:31:28

在软件开发的世界里,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 进行版本控制,还能在遇到复杂的分支问题时,快速定位和解决问题。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Excel MCP: 自动读取、提炼、分析Excel数据并生成可视化图表和分析报告

最近&#xff0c;一款Excel MCP Server的开源工具火了&#xff0c;看起来功能很强大&#xff0c;咱们今天来一探究竟。 基础环境 最近两年&#xff0c;大家都可以看到AI的发展有多快&#xff0c;我国超10亿参数的大模型&#xff0c;在短短一年之内&#xff0c;已经超过了100个&…

C语言:深入理解指针(4)

目录 一、字符指针变量 二、数组指针变量 三、二维数组传参的本质 四、函数指针变量 五、typedef 类型重命名 六、函数指针数组 一、字符指针变量 我们常见的字符指针变量是这样的&#xff1a; char a w; char* p &a; char arr[] "abcd"; char* pa ar…

【更新】全国省市县-公开手机基站数据集(2006-2025.3)

手机基站是现代通信网络中的重要组成部分&#xff0c;它们为广泛的通信服务提供基础设施。随着数字化进程的不断推进&#xff0c;手机基站的建设与布局对优化网络质量和提升通信服务水平起着至关重要的作用&#xff0c;本分享数据可帮助分析移动通信网络的发展和优化。本次数据…

基于MNIST数据集的手写数字识别(CNN)

目录 一&#xff0c;模型训练 1.1 数据集介绍 1.2 CNN模型层结构 1.3 定义CNN模型 1.4 神经网络的前向传播过程 1.5 数据预处理 1.6 加载数据 1.7 初始化 1.8 模型训练过程 1.9 保存模型 二&#xff0c;模型测试 2.1 定义与训练时相同的CNN模型架构 2.2 图像的预处…

idea Maven 打包SpringBoot可执行的jar包

背景&#xff1a;当我们需要坐联调测试的时候&#xff0c;需要对接前端同事&#xff0c;则需要打包成jar包直接运行启动服务 需要将项目中的pom文件增加如下代码配置&#xff1a; <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为核心框架&#xff0c;深度解析纯电动轻卡滑行试验的完整流程与数据建模方法&#xff0c;提供&#xff1a; 法规级试验规范&#xff1a;从环境要求到数据采集全流程详解行驶阻力模型精准标定&#xff1a;最小二乘法求解 ( FAv^2BvC ) 的MATLAB实…

初识——QT

QT安装方法 一、项目创建流程 创建项目 入口&#xff1a;通过Qt Creator的欢迎页面或菜单栏&#xff08;文件→新建项目&#xff09;创建新项目。 项目类型&#xff1a;选择「Qt Widgets Application」。 路径要求&#xff1a;项目路径需为纯英文且不含特殊字符。 构建系统…

kkFileView文件文档在线预览镜像分享

kkFileView为文件文档在线预览解决方案&#xff0c;该项目使用流行的spring boot搭建&#xff0c;易上手和部署&#xff0c;基本支持主流办公文档的在线预览&#xff0c;如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 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt开发 &#x1f448;&#x1f449;QtCharts绘图 &#x1f448;&#x1f449;python开发 &#x1f…

如何在 Windows 10 或 11 上使用命令提示符安装 PHP

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

RK3588 ADB使用

安卓adb操作介绍 adb&#xff08;Android Debug Bridge&#xff09;是一个用于与安卓设备进行通信和控制的工具。adb可以通过USB或无线网络连接安卓设备&#xff0c;执行各种命令&#xff0c;如安装和卸载应用&#xff0c;传输文件&#xff0c;查看日志&#xff0c;运行shell命…

Please install it with pip install onnxruntime

无论怎么安装都是 Please install it with pip install onnxruntime 我python 版本是3.11 &#xff0c;我换成3.10 解决了

低损耗高效能100G O Band DWDM 10km光模块 | 支持密集波分复用

目录 前言 一、产品概述 100G QSFP28 O Band DWDM 10km光模块核心特点包括&#xff1a; 二、为何选择O Band DWDM方案&#xff1f; 1.低色散损耗&#xff0c;传输更稳定 2.兼容性强 三、典型应用场景 1.数据中心互联&#xff08;DCI&#xff09; 2.企业园区/智慧城市组网 3.电信…

第二十六天打卡

全局变量 global_var 全局变量是定义在函数、类或者代码块外部的变量&#xff0c;它在整个程序文件内都能被访问。在代码里&#xff0c; global_var 就是一个全局变量&#xff0c;下面是相关代码片段&#xff1a; print("\n--- 变量作用域示例 ---") global_var …

阿里云ECS部署Dify

一&#xff1a;在ECS上面安装Docker 关防火墙 sudo systemctl stop firewalld 检查防火墙状态 systemctl status firewalld sudo yum install -y yum-utils device-mapper-persistent-data lvm2 设置阿里镜像源&#xff0c;安装并启动docker [base] nameCentOS-$releas…

日志与策略模式

什么是设计模式 IT⾏业 ,为了让 菜鸡们不太拖⼤佬的后腿, 于是⼤佬们针对⼀些经典的常⻅的场景, 给定了⼀些对应的解决⽅案, 这个就是 设计模式 日志认识 计算机中的⽇志是记录系统和软件运⾏中发⽣事件的⽂件&#xff0c;主要作⽤是监控运⾏状态、记录异常信 息&#xff…

Jenkins 最佳实践

1. 在Jenkins中避免调度过载 过载Jenkins以同时运行多个作业可能导致资源竞争、构建速度变慢和系统性能问题。分配作业启动时间可以防止瓶颈&#xff0c;并确保更顺畅的执行。如何实现&#xff1f; 在Cron表达式中使用H&#xff1a;引入抖动&#xff08;jitter&#xff09;&a…

天能股份SAP系统整合实战:如何用8个月实现零业务中断的集团化管理升级

目录 天能股份SAP系统整合案例&#xff1a;技术驱动集团化管理的破局之路 一、企业背景&#xff1a;新能源巨头的数字化挑战 二、项目难点&#xff1a;制造业的特殊攻坚战 1. 生产连续性刚性需求 2. 数据整合三重障碍 3. 资源限制下的技术突围 三、解决方案&#xff1a;S…