Git 教程(三)探秘「.git」目录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/young2415/article/details/89528504


每一个 Git 仓库都会有一个 「.git」目录,这个目录是 Git 仓库的核心部分,存储着该仓库的版本信息和配置信息。今天就让我们看看「.git」目录下都有哪些秘密。

随便打开一个仓库的 「.git」目录,你会发现会有这样几个文件和文件夹:
在这里插入图片描述

一、HEAD文件

HEAD 文件存储着当前的工作分支。查看一下文件内容:
在这里插入图片描述

开头的 ref 代表这是一个引用,而这个引用指向哪里呢,指向 refs/head/master 这个路径。

再查看一下分支:
在这里插入图片描述

Git 就是根据这个 HEAD 文件来判断当前工作分支的。如果你切换了当前分支,那么这个文件的内容也会随之发生改变。

二、refs 文件夹

heads

从上一节中我们得知,HEAD 文件中存储着当前工作分支,这其实是一个路径:refs/heads/master。那么 refs 文件夹是干什么的,我们去里面一探究竟。来到 .git/refs/heads 目录下,发现里面有两个文件,master 和 temp,这正是我们当前仓库的两个分支。分别查看一下 master 和 temp 文件的内容:
在这里插入图片描述

文件中存放的是一串哈希值。每串哈希值其实是指向了一个对象,通过 git cat-file -t 哈希值 这个命令可以查看该哈希值指向的对象类型。
在这里插入图片描述
结果显示,这串哈希值指向的是一个 commit 类型的对象。

注意,我在查看哈希值指向的对象类型的时候,并没有使用完整的哈希值,原来完整的哈希值是「783bbca61fea9dcd8e1b0ba3e7bb8cc8d5bb2a61」,而我只使用了这串哈希值的前几个字符「783bbca」,居然也能正常显示结果,原因是如果这前几个字符就已经是唯一的了,那么 Git 根据这几个字符也能找到相应的对象,而无需使用完整的哈希值。

而当我们查看分支时,
在这里插入图片描述
会发现当前 master 指向的也是哈希值为 783bbca 的这个 commit。temp 也是一样。由此可知,refs/heads 这个路径下存放的是每个分支当前指向的 commit 对象。

tags

refs 下面还有一个文件夹,叫 tags。

tag 相当于一个项目的里程碑,对于比较重要的 commit,比如项目发布 1.0 版本的时候,会给这个 commit 打上一个标签,也就是 tag。tags 这个文件夹下面就存放着仓库中所有的 tag,每一个 tag 文件都存放着一个哈希值,指向被打上标签的 commit 对象。

三、config 文件

config 文件存储着本地仓库的配置信息。查看一下该文件的内容:
在这里插入图片描述
这里面存放的是一些配置信息,如果我们把这个文件内容修改一下,比如,我把用户名改成 supermouse666,然后再去查看配置信息,会发现用户名已经变了。
在这里插入图片描述
反过来也一样,如果使用 Git 的命令修改本地仓库的用户名,那么这个文件内容也会发生改变。比如我把邮箱改成 [email protected]
在这里插入图片描述
在这里插入图片描述

四、objects 文件夹

下图是 objects 文件夹里面存放的一些子文件夹,其中 ① 部分是存放的一些对象,而 ② 部分里面的 pack 文件夹比较特殊,它的作用是,当仓库中松散的对象文件比较多的时候,Git 会自动地做梳理,将这些松散的对象文件打包放到 pack 文件夹下。
在这里插入图片描述
随便打开一个文件夹,里面存放着对象文件。
在这里插入图片描述
文件夹名 + 文件名会组成一个哈希值,这个哈希值指向一个对象,查看一下该对象的类型:
在这里插入图片描述
这是一个 blob 类型的对象,即一个文件对象。可以用 git cat-file -p 哈希值 这个命令查看对象内容。
在这里插入图片描述
可以看到里面其实就是我们所提交的代码文件的内容。

猜你喜欢

转载自blog.csdn.net/young2415/article/details/89528504
Git
今日推荐