日常工作中,经常使用git,最多使用的都是一些对人友好的命令,用久了就想了解git是如何存储文件的,如何管理文件的以及命令背后到底发生了什么。
先学习下面的知识,然后通过命令慢慢理解。
git是一套内容寻址文件系统,即任何内容都是以文件的形式存储的;然后通过文件内容生成一个键值,通过键值找到文件。git是以面向对象的形式存储文件,既然是面向对象,那肯定有对象类型,下面就学习下git中的对象类型。
git中对象类型有三种:blob对象,tree对象和committer对象。
1 blob对象
概念:blob对象是用来存储文本内容的。即把一个包含具体文本内容的文件作为一个blob对象存储在git系统中。
下面通过命令的形式创建一个blob对象。
[1] 首先新建一个git仓库
$ mkdir test-git
$ cd test-git
$ git init
Initialized empty Git repository in E:/git_code/test-git/.git/
一个干净的git仓库包含下面的文件:
$ ll
total 7
-rw-r--r-- 1 XXX8 1049089 130 三月 23 10:30 config
-rw-r--r-- 1 XXX8 1049089 73 三月 23 10:30 description
-rw-r--r-- 1 XXX8 1049089 23 三月 23 10:30 HEAD
drwxr-xr-x 1 XXX8 1049089 0 三月 23 10:30 hooks/
drwxr-xr-x 1 XXX8 1049089 0 三月 23 10:30 info/
drwxr-xr-x 1 XXX8 1049089 0 三月 23 10:30 objects/
drwxr-xr-x 1 XXX8 1049089 0 三月 23 10:30 refs/
初始化仓库中的文件夹和文件的含义如下:
- config文件:包含项目的特定配置项,比如命令别名的配置可以配置在该文件;
- description文件:仅供GitWeb程序使用;
- HEAD文件:文件自始至终只有一行内容,表示当前分支;
- hooks/文件夹:包含客户端或者服务端的钩子文件,主要用来设置自动脚本减少手工操作;为了保证项目的安全,一般不会用到钩子脚本;
- info/文件夹:默认含有一个可执行的文件,文件为.gitignore忽略的内容;
- objects/文件夹:用来存储所有的对象信息;
- refs/文件夹:存储指向分支的提交对象的指针,包括项目中所有的分支指针;
[2] 通过命令创建一个文本文件,并生成一个blob对象:
$ echo 'test conten' | git hash-object -w --stdin
04b35ded9a6e06accbb72875d2b1f05ccbb26afb
命令中参数含义如下:
- ‘text conten’为文本内容;
- git hash-object:git底层命令,可以根据传入的文本内容返回表示这些内容的键值。
- –w:使hash-object命令存储数据,否则仅返回键值而不存储内容;
- –stdin:指定从标准输入设备如键盘来读取内容,若不用这个参数则需要指定一个要存储的文件的路径;
- 04b35ded9a6e06accbb72875d2b1f05ccbb26afb是命令返回的40位的十六进制的键值,称为SHA-1码
[3] 通过键值查看对象内容:
$ git cat-file -p 04b35ded9a6e06accbb72875d2b1f05ccbb26afb
test conten
命令中参数含义如下:
- git cat-file:git底层命令,用来查看二进制文件的内容;
- -p:让命令输出键值指向的文本内容;
[4] 查看该键值的对象类型:
$ git cat-file -t 04b35ded9a6e06accbb72875d2b1f05