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

这篇具有很好参考价值的文章主要介绍了三分钟上手!一文看懂 Git 的底层工作原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这是一篇能让你迅速了解 Git 工作原理的文章,实战案例解析,相信我,3 分钟,绝对能够有收获!

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

Git 目录结构

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

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

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

其目录结构如下:

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

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

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

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"

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

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

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

这一大串是什么?

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

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

我们挨个看下:

065bca(blob):

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

3b18e(blob):

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

824244(tree):

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

c5bc98(commit):

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

ca96(tree):

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

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

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

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

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

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

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:

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

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

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

从其内容可以看到,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"

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

查看当前的 HEAD:

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

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

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

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

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

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

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

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

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

Tag 和 branch 类似,也是指向某个 commit 的指针。不同的是 tag 创建后其指向的 commit 不能变化,而 branch 创建后,其指针会在提交新的 commit 后向前移动。文章来源地址https://www.toymoban.com/news/detail-653249.html

到了这里,关于三分钟上手!一文看懂 Git 的底层工作原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vscode git图形化使用教程(一文秒懂,快速上手)

    vscode 图形化 git ​ 右键 checkout 功能,切换到当前分支 (如果想要切换分支,必须要先上传当前更改的再切换分支,切换完分支后变为之前分支内容) ​ ​ 切换分支后再次提交,从当前版本到最新版本 ​ ​ 创建新分支 ​ ​ ​ ​ 发布分支,当前只是本地分支,然后我们

    2024年03月27日
    浏览(48)
  • YOLOv8 深度详解!一文看懂,快速上手

    YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本,目前支持图像分类、物体检测和实例分割任务,在还没有开源时就收到了用户的广泛关注。 考虑到 YOLOv8 的优异性能,MMYOLO 也在第一时间组织了复现,由于时间仓促,目前 MMYOLO 的 Dev 分支已经支持

    2024年02月03日
    浏览(59)
  • 深入剖析 Git 对象底层原理

    在我们日常使用 Git 时,通常的操作是: 在写完一段代码后,执行 git add 命令,将这段代码添加到暂存区中 然后再执行 git commit 和 git push 命令,将 本地 Git 版本库中的提交同步到服务器中的版本库中 Git 在中间做了什么,它如何存储不同的文件和内容,以及如何区分不同分支

    2024年01月20日
    浏览(47)
  • 新电脑如何磁盘分区?一文看懂五分钟搞定

    咱们新买来的电脑,在存储上一般都会面临两个小问题。 一、如何在不破坏系统的情况下进行分区 二、加装硬盘后如何设置才可以用 今天小A来带大家好好聊一聊。 PART. 1 在不破坏系统的情况下进行分区 首先最简单的问题,如何在不破坏系统的情况下进行分区呢?咱们很多

    2024年02月03日
    浏览(90)
  • YOLOv8 深度解析!一文看懂,快速上手实操(附实践代码)

    关注并星标 从此不迷路 计算机视觉研究院 公众号ID |ComputerVisionGzq 学习群 |扫码在主页获取加入方式 开源地址:https://github.com/ultralytics/ultralytics 计算机视觉研究院专栏 作者:Edison_G YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本,目前支持图

    2024年02月09日
    浏览(47)
  • Git如何查看分支列表?具体步骤是怎样的?底层原理是什么?

    要查看 Git 中的分支列表,可以使用 git branch 命令。该命令会列出当前仓库中所有的本地分支,并在当前分支前面加上一个星号(*)以标识当前所在的分支。 具体步骤如下: 打开终端或命令行窗口,进入 Git 仓库所在的目录。 运行 git branch 命令,该命令会列出所有本地分支

    2024年02月11日
    浏览(48)
  • Git简介与工作原理:了解Git的基本概念、版本控制系统和分布式版本控制的工作原理

    🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬

    2024年02月16日
    浏览(68)
  • 【白话科普】10分钟从零看懂AI绘画原理

    👉腾小云导读 计算机如何生成和真实图片相似的图画?模型是如何听懂我们想要它生成什么并给出对应结果?AIGC 热潮中的 Stable Diffusion、NovelAI、Latent upscale、ControlNet、LoRA等等是什么以及有什么亮点?本篇不涉及任何一个数学公式、不涉及晦涩文献解析,而是通过尽可能直

    2024年02月09日
    浏览(54)
  • 科普|一文看懂虚拟人技术原理

    本文作者来自即构开发者社区@ Daniel 投稿,为我们分享时下热门的数字人技术。IDC 预计,到 2026 年,中国 AI 数字人市场规模将达到 102.4 亿元。开发者有必要对数字人技术有完整的认知和理解。 自从人类探索虚拟现实技术以来,虚拟人技术一直是人工智能和元宇宙技术领域的

    2024年02月09日
    浏览(42)
  • Git分支管理的原理 & 工作区、暂存区的分支共享

    首先,Git是 版本 控制系统,所以Git的存储基本数据单元是不同的 版本对象 ,对应的就是不同的commit。换句话说,我们每commit一次,就是一个版本,也就是一个Git存储单元。 2.1 只有 main 分支时 当只有main分支时,在修改过文件且进行git add 和 git commit 操作后,目前的文件就会

    2024年02月03日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包