Git原理

一、简介

对于Git大部分人都知道如何去使用它,知道有哪些命令,那么Git是如何储存信息的呢,这里我们可以先通过下图先来简单了解一下
在这里插入图片描述

从上图中,我们看到.git/objects目录中存储的最主要的有三类对象:blob、commit、以及tree对象。其实Git中还有一个tag对象,但这并不是重点,我们先来介绍下上图中提到的三种对象。


我们都知道每个Git仓库的所有数据都存储在仓库顶层路径下的.git目录下,这里我们可以新建一个项目来查看一下
在这里插入图片描述
在这里插入图片描述
Git会将所有的信息都储存在.git目录下,而在这些目录和文件中,又以objects路径下的数据内容最多,也最为重要。在Git的设计中,git的核心对象object都存储在.git/objects目录中。



二、blob对象

这里我们可以先查看.git/objects目录,发现现在其中只有两个文件目录,如下:
在这里插入图片描述

然后我们可以去创建一个文件,并执行git add .将其添加至Git的暂存区,由Git进行管理,然后再查看查看.git/objects目录
在这里插入图片描述

这时就发现在.git/objects目录下多了一个文件夹对象,这个其实就是刚刚通过git add .将a.txt文件交由Git管理后生成的c,我们可以来查看下其中内容,如下:
在这里插入图片描述

可以看到是一串乱码,这其实是因为Git将信息压缩成二进制文件,我们可以通过如下命令来进行查看(文件名可使用find .git/objects/ -type f来直接查看)

git cat-file [-t][-p] <file-name>

# -t可以查看object的类型
# -p可以查看object储存的具体内容

在这里插入图片描述
可以发现这个文件是一个blob类型的对象,他的内容就是我们之前提交的“1”,也就是说这个对象储存着a.txt文件的内容


blob对象其实只储存的是一个文件的内容,不包括文件名等其他信息。然后将这些信息经过SHA1哈希算法得到对应的哈希值d00491fd7e5bb6fa28c517a0bb32b8b506539d4d作为生成文件的文件名,也是该对象在Git仓库中的唯一认证。


通过对blob对象的介绍,我们就会发现blob对象存储的仅仅是文件内容,那么如果我们再创建一个b.txt文件,内容同样为“1”,并执行git add .进行提交的话,那么也是不会产生新的blob对象,只有不同文件内容的文件产生才会产生新的blob对象。
在这里插入图片描述
在这里插入图片描述


三、tree对象

当我们执行git commit命令后,再来查看.git/objects目录,发现里面多出来两个对象
在这里插入图片描述

首先我们先来看看第一个对象,使用git cat-file [-t][-p] <file-name>命令,查看其是什么类型以及具体的内容是什么
在这里插入图片描述
从上图看出是一个tree类型的对象,其内容来看可以发现它储存了一个目录结构(类似于文件夹),其中包括每一个文件的权限、类型、blob对象的唯一认证(SHA1值)、以及文件名。


其实tree对象中,还有可能包含子tree对象,如果上述的a.txt、b.txt、b.txt是在src文件夹下,那么我们就有又多出一个tree对象,该tree对象中内容就是上面的f4/7fe2c97这个tree对象,类似如下:

100644 tree f47fe2c97275752499b21e12ea6cb85eeaae9287 src

PS:如果在多级目录下,那么就会多出多个tree对象



四、commit对象

接着查看git commit后多余出来的另一个对象,如下
在这里插入图片描述
这是一个commit类型的对象,它储存的是一个提交的信息,包括对应目录结构的快照tree的哈希值,上一个提交的commit(这里由于是第一个提交,所以没有父节点),提交的作者以及提交的具体时间,最后是该提交的信息。



五、分支信息

上述我们知道了Git是如何储存一个提交的信息,这里再来看看Git分支信息,之前在分支管理及标签管理提到了HEAD指针,就是Git在内部指向当前版本的指针,该信息就存储在.git/HEAD文件中
在这里插入图片描述

可以发现当前版本是master分支,分支信息储存在refs/heads/master中,所以Git中所有的分支信息都存在在refs/heads目录下
在这里插入图片描述

查看其中的内容发现,其实就是上述出现过的commit对象的唯一身份证SHA1值,那么这样的话,我们对Git中如何存储管理文件就十分的清楚了,其主要关系图如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值