今天來看看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資訊。