概述
Git从根本上说是一个基于内容寻址(content-addressable)的文件系统,并在此之上提供一个VCS的用户界面。
最初git只是为VCS提供的一套工具集,而不是一个完成的VCS,所以git存在一系列命令能完成一些底层操作,这些命令被设计为能以Unix-style连接(chained)在一起,或者可以被脚本调用。这些命令被称为底层(plumbing)命令。相对应的那些更友好(user-friendly)的命令被称为高层(porcelain)命令。
通常情况下,不会在命令行中直接使用这些底层命令,它们更多被用于构建新的命令或用于自定义的脚本。
.git目录
在执行完git init
命令后,会生成一个.git
目录。该目录里面包含了几乎所有的git存储和操作的对象。如果你想备份或克隆一个你的repo,只需要将copy该目录即可。
一个已经有提交记录的.git目录内容如下:
1 | [root@localhost .git]# tree -F . |
文件HEAD、index和目录objects、refs是git系统的核心组成部分。
git初始化时的.git目录如下:
1 | [root@localhost .git]# tree -F . |
git对象
数据对象(blob object)
通过 git hash-object
将文件内容写入数据库,生成的就是数据对象,可以通过 git cat-file -t
查看对象类型
1 | 创建一个新文件,将文件内容写入数据库 |
使用上述方式,只能保存文件内容,不能保存文件名称。可以使用下面的树对象实现文件名保存。
树对象(tree object)
git以一种类似Unix文件系统的方式存储内容。所有内容均以树对象和数据对象的形式存储,树对象对应了Unix中的目录项,数据对象大致对应了inodes或文件内容。
一个树对象包含了一条或多条树对象记录(tree entry),每条记录对应一个指向数据对象或子树对象的SHA-1指针,以及对应的模式、类型、文件名信息。