众所周知,Git 是一个非常强大的版本控制系统,要想支撑其运转,底层的存储结构是非常重要的。
当我们使用 git init 新建一个 Git 仓库时,会自动新建一个 .git 目录。
进入 .git 目录中,看看里面有什么
1. COMMIT_EDITMSG 文件
COMMIT_EDITMSG 是每次提交时,写的提交说明,只会保存最后一次写的。
2. config 文件
config 是这个项目的 git 配置
我们可以使用 git config 命令来为 git 项目添加配置,如添加提交时的用户名和邮箱。
其中 git config 有三个指定参数范围的参数
– global 参数是为所有git项目设置参数,这个是环境变量级别的,这个比较常用
git config --global --add user.name git_username
– system 是为这台电脑的所有用户设置,这个不常用
git config --global --add user.name git_username
–local 是单独为当前的 git 项目设置
git config --local --add user.name git_username
当我们使用 git config 命令来设置参数时,就会保存到 .git/config 文件中
3. HEAD 文件
指示当前 HEAD 指向的分支
下面显示我当前是指向 master 分支的
4. hooks
hooks
5. 最重要的 objects
git 中是根据内容是否一致来判断是否是同一个文件的,即使是有两个文件名不同内容相同的文件,git 也会只存储一份。
下面我们可以实际操作来感受一下。
先使用 git init 来初始化一个项目,并且创建一个commit,看看 objects 发生了什么改变
初始项目后: info 和 pack 文件夹都没有内容
当我们创建一个文件,并使用 git add . 提交到暂存区之后,可以发现多了两个文件
我们可以使用 git cat-file 命令来查看对象的类型和实际内容
git cat-file -t 2d832d9044c698081e59c322d5a2a459da546469
注意后面这一串是文件夹名字+文件夹下的内容组成的
可以看到,我们使用 git add . 之后,新增了一个 tree 和 blob 对象
其中 tree 为根节点,blob 为我们创建的那个文件
然后我们创建一个commit
可以看到现在有
一个 commit ,为我们的提交
一个 blob, 为我们创建的文件
一个 tree,为根节点的 tree
一个 tree,包含了blob 的 tree
这三种文件 commit blob tree 就是 git 主要的三种文件了。