今天来看看git对象数据库(object database)的相关内容:
1 首先要弄明白什么是object database,我们先建一个git仓库.
#mkdir test
#cd test
#git init
#vim file.txt
//在文件中输入Hi, zhm
#git add file.txt
#git commit -a -m "The first commit" //此处-m参数项表示“后面的参数是本次提交的历史记录
命令响应:
[master (root-commit) 83161ed] The first commit
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 file.txt
然后再修改file.txt的内容为 Hi, zhm! I'm coming!
紧接着,我们再次提交修改至仓库
#git commit -a -m "The second commit"
命令响应:
[master 818b0fd] The second commit
1 files changed, 1 insertions(+), 1 deletions(-)
我们用git log查看日志信息
#git log
响应如下:
commit 818b0fd7612fed6237ed41ff226005a768ee7ada
Author: zhm <zhm1d1@126.com>
Date: Thu Jun 24 10:22:26 2010 +0800
The second commit
commit 83161eda0efd9f01c8b08a5a09d370bde5020615
Author: zhm <zhm1d1@126.com>
Date: Thu Jun 24 10:21:24 2010 +0800
The first commit
我们观察到每个commit后面都紧跟着一大串字符,这是做什么用的呢?其实这些是哈希值,它能使每次commit的名称是唯一的而且永久有效。
2 .现在要弄明白commit及其所指向的对象的一些信息
执行下列命令:
#git cat-file -t 8316 //8316即为commit后面的ID,此命令参数-t用于查看此ID的对象类型是谁
响应:
commit //即ID8316的对象是一次commit
#git cat-file commit 8316 //commit后+ID,表示查看此commit对象信息
tree fa557b315cd8d8bb66695e424619f3bb81d05398
author zhm <zhm1d1@126.com> 1277346084 +0800
committer zhm <zhm1d1@126.com> 1277346084 +0800
The first commit
从命令响应信息中可以看出,一个commit对象的信息含有一个tree及这个tree的ID,实际上这个treeID表示一个BLOB对象,此BLOB对象可能包含另外一个tree对象或者是源文件,我们可以用命令ls-tree查看这个tree的更多信息。
#git ls-tree fa55 //此命令用于显示tree对象的信息,后面为tree的ID
100644 blob 1f0da587535282ac32bae3e5cfab854678d9f128 file.txt
很显然,这个tree对象包括一个blob对象,后面为blob对象的ID:1f0da,并且此blob对象包含一个file.txt文件,而blob对象包含于tree,即这个tree包含一个文件file.txt.
#git cat-file -t 1f0d
blob
#git cat-file blob 1f0d
Hi,zhm
即,ID:1f0d的对象为BLOB,这个对象blob是一个文件,文件的内容为:Hi, zhm
3 以上所述的对象信息全都存储在.git/objects目录下,可以使用find命令查看:
.git/objects/
.git/objects/c8
.git/objects/c8/d1b415b09ee6febb5f3231529bc8e9ca2d0243
.git/objects/pack
.git/objects/info
.git/objects/1f
.git/objects/1f/0da587535282ac32bae3e5cfab854678d9f128
.git/objects/83
.git/objects/83/161eda0efd9f01c8b08a5a09d370bde5020615
.git/objects/6b
.git/objects/6b/9a967d8b812082c448e354269bad7007fdfc97
.git/objects/81
.git/objects/81/8b0fd7612fed6237ed41ff226005a768ee7ada
.git/objects/fa
.git/objects/fa/557b315cd8d8bb66695e424619f3bb81d05398
4.我们查看HEAD的信息
#cat .git/HEAD
ref: refs/heads/master //为HEAD内容,即HEAD指向refs/heads/master,我们继续按这个路径追查下去
#cat .git/heads/master
818b0fd7612fed6237ed41ff226005a768ee7ada
这个master给出一个ID,继续追查
#git cat-file -t 818b
commit //即master主干道指向一次commit,继续追查
#git cat-file commit 818b
tree c8d1b415b09ee6febb5f3231529bc8e9ca2d0243
parent 83161eda0efd9f01c8b08a5a09d370bde5020615
author zhm <zhm1d1@126.com> 1277346146 +0800
committer zhm <zhm1d1@126.com> 1277346146 +0800
The second commit
由上可以得知,HEAD包含当前所处的分支信息,并且指向最后一次提交commit,而且还包括一个parent对象,指向上次提交的commit信息。