每一个 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 的命令修改本地仓库的用户名,那么这个文件内容也会发生改变。比如我把邮箱改成 123456@163.com


四、objects 文件夹
下图是 objects 文件夹里面存放的一些子文件夹,其中 ① 部分是存放的一些对象,而 ② 部分里面的 pack 文件夹比较特殊,它的作用是,当仓库中松散的对象文件比较多的时候,Git 会自动地做梳理,将这些松散的对象文件打包放到 pack 文件夹下。

随便打开一个文件夹,里面存放着对象文件。

文件夹名 + 文件名会组成一个哈希值,这个哈希值指向一个对象,查看一下该对象的类型:

这是一个 blob 类型的对象,即一个文件对象。可以用 git cat-file -p 哈希值 这个命令查看对象内容。

可以看到里面其实就是我们所提交的代码文件的内容。
本文深入解析Git仓库核心.git目录的秘密,包括HEAD文件、refs文件夹、config文件和objects文件夹的作用及内部结构,揭示版本控制的核心机制。
探秘「.git」目录&spm=1001.2101.3001.5002&articleId=89528504&d=1&t=3&u=5935d167744c42e49c283c80368034fc)
7425

被折叠的 条评论
为什么被折叠?



