当创建一个仓库时,Git 会自动生成一个 .git 的目录,前面说过这个目录是整个仓库的核心。进入到 .git 文件夹中,可以看到里面的文件如下:

HEAD 文件

根据上图,.git 文件夹中存在一个 HEAD 的文件,使用命令 cat 查看里面的内容。

这里有一个引用,指向了前面文章中新创建的一个分支 test,切换回 master 分支,再 cat 一下看看。

由此可见,HEAD 文件的作用就是当切换分支后,它会告诉我们当前工作的是哪一个分支。

config 文件

在对 Git 进行配置时,提到过它有三个作用域,分别为 localglobalsystem,当创建 local 用户时,该用户的信息就保存在此处的 config 文件中,在对这个仓库进行操作时,不论有没有配置 global 或 system,默认使用的都是 local 用户。

refs 文件夹

进入该文件夹,可看到有两个文件夹,分别为 headstags

heads 文件夹

heads 文件夹在上面的 HEAD 文件中可以看出,它包含了该仓库下面的分支信息,告诉我们当前工作的是哪一个分支,在项目中,分前后端,可以前端建立一个分支,后端建立一个分支,这样开发的时候就能互不干扰的进行下去。

进入到 heads 文件夹中发现存在两个文件,都对应着之前创建的两个分支 mastertest,通过命令 catgit cat-file -t 可查看文件内容和类型。

可看出,是一个 commit 类型,这里的 master 分支指向了 f7a1bd74... 这一个 commit

tags 文件夹

关于标签,相当于一个里程碑,在一个项目开发到 v 1.0 等情况时,可以添加一个标签,表示到达了一个有纪念意义的里程碑。当创建标签后,其指向的是一个 tag 类型,查看方法与 heads 文件夹一样。

objects 文件夹

进入文件夹,内容如下:

可看到有很多类似 0011 这样的文件夹,而最后有一个 pack 文件夹,它的作用是当前面的零散的文件夹太多的话,它会自动打包存放。

随便进入一个文件夹,查看内容

再查看一下类型,这里进行查看类型,需要加上文件夹名 6f 和文件夹内的 054a3d...

tree 表示它是一棵树,再用命令 git cat-file -p 查看它的文件内容

可以看到它指向了一个文件 README.md,而该文件的哈希值又为 90dfd39...,它的类型是 blob,这时在使用命令查看文件类型和文件内容,就可以查看到文件类型为 blob,内容和之前编写的 README.md 内容是一样的。

三种类型的关系

通过本文之前一系列操作,知道了 Git 中存在着三个类型,分别是 committreeblob

  • 一个 commit 只对应一棵树(tree)
  • 一棵树 tree 对应一个文件夹或者一个文件的快照,树中可能包含文件夹或者文件
  • 而一个文件则就对应一个 blob

blob 对应的不是某个文件名,而是文件内容,Git 中只要文件内容是一样的,它就会默认是一个文件,和文件名无关。所以它们之间相互连接的是之前提过的文件内容哈希值,和文件名无关。

总结

.git 文件夹中上述几个文件相对比较重要,掌握上面的内容即可。

HEAD 指向当前的工作路径

config 存放本地仓库(local)相关配置信息

refs/heads 存放分支

refs/tags 存放 tag

objects 存放对象,该文件夹中的子文件夹都是以哈希值的前两位字符命名,每个 object 由 40 位字符组成,前两位当作文件夹,后 38 位作文件