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

news2024/9/27 9:19:53

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

 

Git 目录结构

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

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

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

其目录结构如下:

图片

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

  • 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"

图片

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

图片

这一大串是什么?

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

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

我们挨个看下:

065bca(blob):

图片

3b18e(blob):

图片

824244(tree):

图片

c5bc98(commit):

图片

ca96(tree):

图片

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

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

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

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

图片

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:

图片

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

图片

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

图片

查看当前的 HEAD:

图片

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

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

图片

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

图片

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

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

图片

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

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

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

相关文章

极简版VS自定义:我选择极简版

极简版VS自定义:我选择极简版 😇博主简介:我是一名正在攻读研究生学位的人工智能专业学生,我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑,欢迎随时来交流哦!&…

图数据库_Neo4j_Centos7.9安装Neo4j社区版3.5.4_基于jdk1.8---Neo4j图数据库工作笔记0011

首先上传安装包,到opt/soft目录 然后看一下jdk安装的是什么版本的,因为在neo4j 4以后就必须要用jdk11 以上的版本,我这里还用着jdk1.8 所以 我这里用3.5.4的版本 关于下载地址: https://dist.neo4j.org/neo4j-community-3.5.4-unix.tar.gz 然后再去解压到/opt/module目录下 …

用递归与迭代完成二叉树的三种遍历

目录 二叉树的前序遍历 题目 前序遍历题目链接 递归代码 1.利用方法返回值的代码 2.返回值为void的代码 非递归实现前序遍历(利用栈stack) 1.利用方法返回值的代码 2.返回值为void的代码 二叉树的中序遍历 题目 :给定一个二叉树的根节点 root ,返回 它…

小红书数据分析:如何借势热点ip,打造爆款热度笔记

导语 影视作为小红书的后起板块之一,今夏来势汹汹~众多「爆款」影视/电影的出现极大程度上刺激着社区用户保持发布欲望,抬升了用户碎片化表达的意愿,刺激了小红书社区内容的活跃度。 小红书独有的社区特色,让影视作品除了解说外…

冠霖团队与TPC公司线下会议共谋TPC资产管理基金项目合作

近年来,金融市场蓬勃发展,为全球各大金融机构提供了前所未有的合作机会。在这个背景下,冠霖团队和TPC公司的线下会议成为一场引人瞩目的合作洽谈,旨在共同探讨TPC资产管理基金项目的合作机会与前景。 TPC公司作为一个拥有广泛国际…

3D模型格式转换工具如何与Parasolid集成?

概述 HOOPS Exchange包括一个 Parasolid 连接器,它允许 Parasolid 开发人员轻松地将 CAD 数据导入到活动的 Parasolid 会话中。如果源数据基于 Parasolid(NX、Solid Edge 或 SolidWorks),则数据将按原样导入。 这意味着您可以假…

京东门详一码多端探索与实践 | 京东云技术团队

本文主要讲述京东门详业务在支撑过程中遇到的困境,面对问题我们在效率提升、质量保障等方向的探索和实践,在此将实践过程中问题解决的思路和方案与大家一起分享,也希望能给大家带来一些新的启发 一、背景 1.1、京东门详介绍 1.1.1、京东门…

python怎么下载以前的版本,python怎么下载第三方库

大家好,给大家分享一下python怎么下载以前的版本,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! Python 下载安装(文末附python全套学习资料) 安装python分三个步骤:1.下载python 2.安装pyth…

计网第三章(数据链路层)(二)

目录 一、可靠传输 二、可靠传输的三种实现机制 1.停止等待协议SW(自动重传协议ARQ) (1)理想情况(即无差错情况): (2)有误码的情况: (3&#…

Python中5种下划线的含义,你都知道吗

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 话不多说,直接开搞,如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 1.单前导下划线:_var 当涉及到变量和方法名称时,单个下划线前缀有一个约定俗成的含义。 它是对程…

【04 英语语法:非谓语动词(不定式、分词、动名词)详解】

非谓语动词 非谓语动词:不定式,分词,动名词1. 不定式:动词原形(do/原形不定式),带 to 不定式 (to do)1.1 带 to 不定式(to do)的功能:…

Apipost预执行脚本如何调用外部jar包

近期版本更新中Apipost推出插件管理,可以直接在预、后执行脚本中调用本地的脚本文件 导入脚本 在「系统设置」—「插件管理」中打开目录将要执行的脚本文件拖入到文件夹下 执行脚本 需要获取请求参数: const requestData request.request_bodys; 在…

版本控制工具Git集成IDEA的学习笔记(第二篇GitHub)

目录 一、团队内协作和跨团队协作讲述 1、团队内协作 2、跨团队协作 二、团队内合作交互方式 1、初始化本地库 2、创建远程库 3、在本地创建远程库地址的别名 4、推送操作 5、克隆操作 6、邀请加入团队,push操作 7、远程库修改的拉取操作 8、远程库修改…

【Vue】yarn 安装包时权限不足或者文件夹被占用导致安装失败

在一个 Vue3 项目中,用 yarn 安装 Vue 插件或者 Vue-Router 时,出现同样的 error ,如下: An unexpected error occurred: “EPERM: operation not permitted, unlink ‘C:\Codefield\项目\yupao-frontend\node_modules\esbuild\w…

zabbix配置微信报警

如有错误,敬请谅解! 此文章仅为本人学习笔记,仅供参考,如有冒犯,请联系作者删除!! 6.1 注册企业微信 企业微信注册地址:https://work.weixin.qq.com 设置总部门名称添加成员 也可以…

小程序项目组件的基本应用

宿主环境:程序运行必须依赖的环境 小程序的宿主环境 ---->手机微信(定位、扫码、支付等) 小程序的通信模型: 渲染层和逻辑层之间的通信(微信客户端转发)逻辑层和第三方服务器之间的通信(微信客户端转发) 小程序的运行机制: 启动&#xff1…

chrome屏幕共享插件的获取和配置

文章目录 1. 下载插件2. 加载插件3. 打开这个文件4. 关掉开发者模式 1. 下载插件 https://github.com/webrtc/samples/blob/gh-pages/release/desktopCaptureExtension.zip 不过我下载不了,找别人要了这个文件 解压 2. 加载插件 选择 扩展程序—》管理扩展程序 加…

拥抱变革 展现PMO力量 | 易趋受邀出席2023第十二届中国PMO大会

2023年8月12-13日,由PMO评论主办的第十二届中国PMO大会(以下简称PMO大会)在北京成功落幕。 (主论坛一现场) 本届大会以“拥抱变革 展现PMO力量”为主题,设置了“PMO与组织变革”、“PMO与组织战略”2个主论…

vueuse常用方法

useDateFormat 时间格式化 <script setup lang"ts">import { useNow, useDateFormat } from vueuse/coreconst formatted useDateFormat(useNow(), YYYY-MM-DD HH:mm:ss)</script><template><div>{{ formatted }}</div> </templa…

【爱书不爱输的程序猿】公网访问本地搭建的WEB服务器之详细教程

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本地电脑搭建Web服务器并用cpolar发布至公网访问 前言1. 首先将PHPStudy、WordPress、cpolar下载到电脑2. 安装PHPStudy3. 安装cpolar&#xff0c;进入Web-UI界面4.安装wordpress5.…