git文件对象

git文件对象
一、.git文件夹分析

  .git文件夹有git仓库管理的必须文件,且只有当前目录有.git文件才能使用git命令。通过git clonegit init命令初始化。

  •object文件夹:存储了文件对象,并使用SHA-1算法生成40位散列值将前两位作为文件夹,后38位作为文件名。

  •config文件:git仓库的配置文件,跟git config命令有关。

  •HEAD文件:分支的指示指针,HEAD指向哪个分支表示当前git仓库处于哪个分支上。

  •index文件:表示暂存区。

二、文件对象

  git有三种文件对象,分别是blob、tree、commit。blob对象存储当前版本的文件快照,tree存储着目录结构和 blob 对象索引,commit存储着指向前述树对象的指针和所有提交信息。举个例子:
1、在test_1文件夹里面初始化了git库,并且创建一个文件test_1.c,并写入include<stdio.h>

2、使用git add test_1.c将test_1.c文件加入暂存区,可以在./test/.git/objects/下生成了一个新的文件夹35(这是数字是SHA-1算法生成的,将前两位作为文件夹名,后38位作为文件名),35文件夹下有一个名为4499acd60e01f6d3b56ed83f0a8d077effb0f2的文件,该文件就是blob对象,保存的是test_1.c的文件快照。使用git cat-file -p 354499(这个命令可以查询4499ac这个文件的内容,-t查看对象类型的有blob、tree、commit三种类型,384499是40位散列值的6位缩写代表一个文件对象)查询,可以得出命令的输出值就是前面写入的include<stdio.h>,使用-t参数输出blob,也就代表当前的对象属于blob对象。所以当一次修改被加入暂存区时git会用blob保存当前修改的文件快照,同一个目录下对于同名内容一致的文件采用同一个对象存储,也就是说在当前目录下,假设是另一个文件夹下有一个test_1.c且内容和前一个一致,那么这两个文件共用同一个文件对象,即354499。

3、为了解释tree和commit对象,在test目录下新建一个test_2文件夹,并且创建test_2.c文件,写入#include<math.h>。提交到暂存区git add test_2,然后git commit提交git仓库。然后转到objects文件夹会发现对象文件变成了5个,如下。为什么会变成5个?按照之前的理解是add了两个文件,所以有两个blob对象,然后commit一次后会产生一个tree对象和一个commit对象,总共应该是4个对象文件。实际上不是这样的,准确来说git会为每个文件夹生成一个tree对象,类似文件目录的树结构,在本例中有两个文件夹因此git生成了两个tree对象,所以总共有5个文件对象。下面细看这几个文件对象的内容,blob对象就不重复说了。git cat-file -p 文件名97、c8、ff输出如下,可以得出97是commit对象,包含了提交信息和tree的指针,该对象指向ff对象。我们看看ff tree对象的内容,包含了一个blob对象记录test_1.c文件信息,还包含一个树对象指向c8即test_2文件夹。最后看看c8 tree对象,包含一个blob对象记录test_2.c文件信息。由此可以分析出git将文件夹目录下的文件信息抽象成blob对象,并将这个集合抽象成tree对象,根据文件夹的层级抽象出多棵子树。最后将根节点抽象成一个commit对象。

文件对象

文件对象内容
三、总结
  现在回过头来看git的文件区间是不是感觉很好懂,git相当于一个文件管理员,本地文件未add时,git并不知道这个文件,一旦add git就将这些文件生成blob对象并纳入管理,在暂存区(index)生成相应的索引,使用git ls-files --stage可以查看index文件的内容,可以看到index文件存储的就是blob对象的散列值和文件路径。commit做的事就是将blob对象打包成tree和commit对象,保存到本地仓库,这相当于一次改动的集合。仔细思考为什么git的所有操作都这么的迅速,主要的原因是每次add、commit操作时都以对象文件的方式存储了所有的改动信息,这些对象文件都有不重复的散列值,且相同的文件具有相同的散列值,通过散列值的校验,git可以快速的进行操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值