当前位置:   article > 正文

【Git】探秘Git的.git中几个重要的文件夹_.git文件夹

.git文件夹

在这里插入图片描述

1、HEAD文件

cat HEAD
  • 1

在这里插入图片描述
那我们如果将分支切换到master,再查看这个文件呢?

git checkout master
cat .git/HEAD
  • 1
  • 2

在这里插入图片描述
猜想正确,拉走,下一个

2、config文件

cat .git/config
  • 1

在这里插入图片描述在这里插入图片描述
就是一些配置信息存储在这

3、refs文件夹

在这里插入图片描述
因此我们知道在heads中存储的是我们所有的分支
tags中是我们的标签,常见的标签用法是版本信息,更新到某一个比较大的点,如2.0,就可以加一个标签信息

那么,这个master文件里边存储的这么长一串是什么呢?其实是一个对象 地址
我们可以通过git cat-file -t ‘哈希地址信息’

git cat-file -t 'a9077'
# 只需要写入能够唯一识别的长度即可,如果已经有了a9077,就需要写更长点a90778
  • 1
  • 2

去查看这个对象的类型在这里插入图片描述
可以看到此处存储的是一个commit类型的对象,想看到对象中更进一步的内容

git cat-file -p 'a9077'
  • 1

在这里插入图片描述
可以看到显示出了提交者、作者、父类分支、树
关于树,我们下文中再讲

4、objects文件夹

在这里插入图片描述
我们打开最后一个f6文件夹
在这里插入图片描述
这又是什么呢?git里边查看文件类型,是git cat-file -t,查看文件内容是git cat-file -p
此处object的存储方式是需要前边拼上文件夹名称f6的,因此我们查看一下类型和内容
在这里插入图片描述
我们能看出来这个对象是一个tree类型。
文件内容是我们提交过的a.txt,b.txt和c.txt (这三个文件内容都是空白)

需要注意的是:a.txt,b.txt,c.txt这三个都是blob类型,而且hash地址是一样的。
因为:git中针对内容相同的文件,使用的是同一个blob文件,只是存储的引用不同

5、其他文件夹

阿里云博客传送门:.git文件夹探秘,理解git运作机制

6、commit、tree和blob三个对象之间的关系

● 每一次commit相当于创建了一个commit对象,commit对象中包含一个tree对象、父亲分支信息、作者信息、提交者信息
● tree对象内部包含其他的tree对象和一些blob对象信息。

commit操作相当于给仓库拍了一个快照,存储的是当前整个的已提交的文件区域的信息。
我们假设,进行了过这样的操作

  1. 我们新建了a.txt,commit了一次,创建了一个commit对象,并且往这个对象里塞了一个tree对象,此时就有一个快照(又称为树tree的对象进行存储)存入了commit对象,暂且称为tree1,tree1中只有一个文件,文件的类型在git中时blob类型。
  2. 有新建了b.txt ,commit了一次,此时就有一个新的tree对象存储,这个tree2对象中,包含了tree1的信息,因为我们是在tree1的基础上做了新增,这样做可以最节省存储空间
  3. 如果我们第三次提交修改了a.txt内容,并且新增了一个c.txt。那么第三次创建commit的对象中,会删除掉tree1对象,直接添加a.txt的blob地址,使用了tree2对象

一句话概括:
commit包含tree对象和blob对象、tree对象包含blob对象;

文件是一个blob对象,tree对象包含若干文件,相同文件内容只会存入一个blob,commit对象中包含若干个tree和blob

思考:

新建一个git仓库,有且仅有一次commit,仅仅包含/doc/readme,请问内含多少个tree?多少个blob?多少个object?在这里插入图片描述
因此,这次有四个对象被创建,其中有一个commit对象,两个tree对象(文件夹会被视为一个tree对象),这个文件夹对象tree包含在总的tree中,一起放入了commit对象中
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/901073
推荐阅读
相关标签
  

闽ICP备14008679号