三分钟上手! 一文看懂 Git 的底层工作原理

news2024/11/14 9:17:11

目录

  • 1. 三分钟上手! 一文看懂 Git 的底层工作原理
    • 1.1. Git 目录结构
    • 1.2. Git 三大对象
    • 1.3. Git Brach 和 Tag

1. 三分钟上手! 一文看懂 Git 的底层工作原理

1.1. Git 目录结构

Git 的本质是一个文件系统(很重要, 记住这句话, 理解这句话), 工作目录中的所有文件的历史版本以及提交记录(commit)都是以文件对象的方式保存在 .git 目录中的。

我们先来创建一个名为 git-demo 空目录, 并采用 git init 命令初始化 Git 仓库。该命令会在工作目录下生成一个 .git 目录, 该目录将用于保存工作区中所有的文件历史的历史版本, commit, branch, tag 等所有信息。

$ mkdir git-demo
$ cd git-demo
$ git init

其目录结构如下:

1.webp

待会我们重点关注下这几个目录:

  • HEAD: 工作目录当前状态对应的 commit, 一般来说是当前 branch 的 head, HEAD 也可以通过 git checkout 命令被直接设置到一个特定的 commit 上, 这种情况被称之为 detached HEAD
  • objects: 这里是真正保存 Git 对象的目录, 包括三类对象 commit, tree 和 blob(具体这三类对象是什么, 慢慢往下看就知道了)
  • refs: 用来保存 branch 和 tag 对应的 commit

1.2. Git 三大对象

目前 Objects 目录中还没有任何内容, 我们创建一个文件并提交:

$ git:(master) echo "my project" > README
$ git:(master) mkdir src
$ git:(master) echo "hello world" > src/file1.txt

添加并提交:

$ git:(master) git add .
$ git:(master) git commit -m "init commit"
2.webp

从打印输出可以看到, 上面的命令创建了一个 commit 对象, 该 commit 包含两个文件。查看 .git/objects 目录, 可以看到该目录下增加了 5 个子目录 06, 3b, 82, c5, ca, 每个子目录下有一个以一长串字母数字命令的文件:

3.webp

这一大串是什么?

Git Object 目录中存储了三种对象: Commit, Tree 和 Blob, Git 会为对象生成一个文件, 并根据文件信息生成一个 SHA-1 哈希值作为文件内容的校验和, 创建以该校验和前两个字符为名称的子目录, 并以 (校验和) 剩下 38 个字符为文件命名 , 将该文件保存至子目录下。

可以通过 git cat-file -t 哈希值 命令查看对象类型, 通过 git cat-file -p 哈希值 命令查看对象中的内容, 哈希值就是目录名+文件名, 在没有歧义的情况下, 命令可以不用输入整个哈希值, 输入前几位即可。

我们挨个看下:

065bca(blob):

4.webp

3b18e(blob):

5.webp

824244(tree):

6.webp

c5bc98(commit):

7.webp

ca96(tree):

8.webp

认真看图, 大家看完也就差不多清楚了 commit、blob、tree 这几大对象是什么东西了

从 commit 对象(c5bc98)入手, commit 对象中保存了 commit 的作者, commit 的描述信息, 签名信息以及该 commit 中包含哪些 tree 对象和 blob 对象。从上图可知包含了 tree 对象(ca96)。

可以把 tree 对象看成这次提交相关的所有文件的根目录, 可以看到 ca96 这个 tree 对象中包含了一个 blob 对象(065bca), 即 README 文件, 以及一个 tree 对象(824244), 即 src 目录。而 blob 对象存储的就是真正的内容。

这几个对象的对应关系如下图所示:

9.webp

1.3. Git Brach 和 Tag

现在来看下 HEAD 中的内容, 前面说过, HEAD 中存储的是工作目录当前状态对应的 commit:

$ git:(master) cat .git/HEAD
ref: refs/heads/master
$ git:(master) cat .git/refs/heads/master
c5bc98b8990bedd7444da537320559e601eba87b

c5bc98 正是我们最近的这次 commit!

master 是一个分支名, 所以分支(branch)的本质是一个指向 commit 的指针

我们切一个新分支 feat/work:

10.webp

查看下 refs/heads/master 和 refs/heads/feat/work 中的 commit 值:

11.webp

从其内容可以看到, feat/work 这个 branch 并没有创建任何新的版本文件, 和 master 一样指向了 c5bc98 这个 commit。

从上面的实验可以看出, 一个 branch 其实只是一个 commit 对象的应用, Git 并不会为每个 branch 存储一份拷贝, 因此在 git 中创建 branch 几乎没有任何代价。

接下来我们在 feat/work 这个 branch 上进行一些修改, 然后提交:

$ git:(feat/work) echo "new line" >> src/file1.txt
$ git:(feat/work) echo "do nothing" >> License
$ git:(feat/work) git add .
$ git:(feat/work) git commit -m "some change"
12.webp

查看当前的 HEAD:

13.webp

可以看到 HEAD 指向了 feat/work 这个 branch, 而 feat/work branch 则指向了 8a442 这个 commit, master branch 指向的 commit 未变化, 仍然是 c5bc98。

查看 8a442 这个 commit 对象的内容:

14.webp

可以看到 commit 有一个 parent 字段, 指向了前一个 commit c5bc98。还包含了一个 tree 对象(2a9dd):

15.webp

可以观察到, 由于 README 没有变化, 还是指向的 065bca 这个 blob 对象。License 是一个新建的 blob 对象, src 和 file1.txt 则指向了新版本的对象。

增加了这次 commit 后, Git 中各个对象的关系如下图所示:

16.webp

Tag 和 branch 类似, 也是指向某个 commit 的指针。不同的是 tag 创建后其指向的 commit 不能变化, 而 branch 创建后, 其指针会在提交新的 commit 后向前移动。

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

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

相关文章

跟随角色镜头时,解决地图黑线/白线缝隙的三种方案

下面一共三个解决方案,这里我推荐第二个方案解决,因为够快速和简单。 现象: 解决方案一: 参考【Unity2D】去除地图中的黑线_unity选中后有线_香菇CST的博客-CSDN博客,博主解释是因为抗锯齿采样导致的问题。 具体到这…

机器人操作系统:ROS2 仿真入门

塞巴斯蒂安 一、说明 在机器人项目中,仿真是一个具有多种用途的重要方面。首先,您可以测试希望机器人执行的行为代码。其次,您可以使用仿真来测试不同类型的硬件,例如距离传感器、相机或 3D 点云传感器,看看哪种效果最…

找免费视频剪辑素材就上这6个网站

视频剪辑必备的6个免费素材网站,值得收藏~ 1、菜鸟图库 视频素材下载_mp4视频大全 - 菜鸟图库 菜鸟图库不仅是一个设计网站,它还有非常丰富的视频和音频素材,视频素材高清无水印,全部都有标签分类,各种类型都能找到。…

直线模组的运行注意事项

直线模组是属于高精密的传动元件,大家都知道,安装不当,直线模组就无法显示其高精度的优势,不仅如此,使用不当也会磨损直线模,针对直线模组的使用安全性事宜,我们切记严苛遵照有关的安全操作规程…

QuantLib学习笔记——利用quantlib绘制零息利率(zero rate)期限结构曲线

⭐️ 引言 利率,这个看似简单的概念,在金融领域有很多内涵。以这个词为基础,扩展出类似零息利率(即期利率)、远期利率等概念。本文就零息利率展开讨论,并绘制零息利率期限结构曲线。 ⭐️ 一些金融概念 …

TCP拥塞控制详解 | 6. 主动队列管理

网络传输问题本质上是对网络资源的共享和复用问题,因此拥塞控制是网络工程领域的核心问题之一,并且随着互联网和数据中心流量的爆炸式增长,相关算法和机制出现了很多创新,本系列是免费电子书《TCP Congestion Control: A Systems …

中小企业进销存软件哪个好?4款进销存商品管理软件推荐-亿发

在现代商业运营中,有效的开单记账系统是中小商户增强管理水平、优化业务流程的重要利器。市面上涌现出众多开单记账软件,如亿发软件、秦丝、智慧记、管家婆等,每款软件都有各自的优势和特点。本文帮助您了解每款软件的特点,为您的…

周期性函数算出其周期(python)

在日常生活中,总是会遇见一些周期性的函数,我们可以人眼看出他们是有一定规律的,但是我们不能准确地发现它们的周期是多少。 创建一根周期性曲线 import numpy as np import matplotlib.pyplot as plt# 定义周期性函数 def periodic_functi…

行业追踪,2023-08-21

自动复盘 2023-08-21 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

教师爱用查分利器

易查分是一款非常实用的教学工具,给老师们提供了便捷的学生成绩管理和学生信息管理功能。通过易查分,老师们可以轻松地发布学生成绩,录入成绩,并对学生信息进行有效管理,从而进行提高班级管理效率。 易查分能够方便地发…

通过 git上传到 gitee 仓库

介绍 Git是目前世界上最先进的分布式版本控制系统,有这么几个特点: 分布式 :是用来保存工程源代码历史状态的命令行工具。保存点 :保存点可以追溯源码中的文件,并能得到某个时间点上的整个工程项目额状态;…

在google play store 里安装expo go

参考链接: https://chat.xutongbao.top/

智慧医院IT运维方案,全局网络态势感知

随着医疗卫生体制改革不断深化,卫生行业信息化应用不断普及,大数据、AI、医疗物联网等技术的应用,快速推动“智慧医院”建设。以HIS(医院信息系统)、EMRS(电子病历系统)、PACS(影像归…

Linux学习 3

date 显示当前时间 date -s 字符串时间 ,设置系统时间 cal 显示当前日历,默认显示当前月 cal 2023 展示全年日历 find指令,从执行目录向下递归遍历各个子目录 find 搜索范围 选项 find /root -name hello.txt find /root -user goc fi…

Qt6之带三角形的提示框——仿ToDesk(3)

声明:本文仅用于用qt学习todesk界面设计; 如下左图有一排扩展功能的菜单,鼠标滑块会显示带三角形的提示框,本文将用qt实现如右图: 1、布局按钮 直接拖拽出QPushButton,7个,分别设置默认样式和…

从零开始,IntelliJ IDEA快速创建 SpringBoot 项目

准备 Java JDK8 下载 https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 开发工具 IntelliJ IDEA 下载 https://www.jetbrains.com/idea/ 接口调试工具 Postman 下载 https://www.postman.com/downloads/ 创建项目 用IDEA创建SpringBoot项目 打…

OLED透明屏案例:揭示技术创新的无限可能性

OLED透明屏作为一项创新性技术,在各个领域展现出了令人惊叹的应用潜力。 那么,尼伽便通过介绍一些具体的OLED透明屏案例,探索其在智能家居、汽车行业、商业展示、航空航天、教育与培训以及医疗健康等领域的成功应用。 这些案例将展示OLED透明…

JAMstack架构:快速构建安全、高性能的现代应用

随着Web应用的快速发展,开发者们在寻找更加高效、安全和可维护的应用架构。JAMstack架构应运而生,它通过将前端、后端和部署过程分离,提供了一种现代化的方式来构建Web应用。在本文中,我们将深入探讨JAMstack架构的特点、优势以及…

人事变动?前沃尔沃汽车大中华区总裁钦培吉将加盟吉利

根据消息,吉利控股集团高级副总裁杨学良在今天上午通过微博宣布,前沃尔沃汽车大中华区总裁钦培吉将加盟吉利。钦培吉将担任吉利汽车集团销售公司副总经理,并负责集团渠道发展委员会的主任一职,向吉利汽车集团的高级副总裁林杰报告…