我們可以使用cat-file命令去查詢特定對象的信息. 注意下面只鍵入了SHA值的一部分, 不必把40個字符全部鍵入:
~~~
$ git-cat-file -t 54196cc2
commit
$ git-cat-file commit 54196cc2
tree 92b8b694ffb1675e5975148e1121810081dbdffe
author J. Bruce Fields <bfields@puzzle.fieldses.org> 1143414668 -0500
committer J. Bruce Fields <bfields@puzzle.fieldses.org> 1143414668 -0500
initial commit
~~~
一個樹(tree)對象可以引用一個或多個塊(blob)對象, 每個塊對象都對應一個文件. 更進一步, 樹對象亦可以引用其他的樹對象, 從而構成一個目錄層次結構. 你可以使用ls-tree去查看樹的內容:
~~~
$ git ls-tree 92b8b694
100644 blob 3b18e512dba79e4c8300dd08aeb37f8e728b8dad file.txt
~~~
我們可以看到樹中包含了一個文件. SHA值是文件內容的一個引用(譯者注: 相當于指針指向對應的塊對象).
~~~
$ git cat-file -t 3b18e512
blob
~~~
一個"塊"(blob)即是文件的數據, 我們可以用cat-file查看其內容:
~~~
$ git cat-file blob 3b18e512
hello world
~~~
注意到文件中的數據是舊的. 初始樹其實是第一次提交時記錄的目錄狀態快照.
所有的對象都使用SHA1值作為索引存儲在git目錄之下:
~~~
$ find .git/objects/
.git/objects/
.git/objects/pack
.git/objects/info
.git/objects/3b
.git/objects/3b/18e512dba79e4c8300dd08aeb37f8e728b8dad
.git/objects/92
.git/objects/92/b8b694ffb1675e5975148e1121810081dbdffe
.git/objects/54
.git/objects/54/196cc2703dc165cbd373a65a4dcf22d50ae7f7
.git/objects/a0
.git/objects/a0/423896973644771497bdc03eb99d5281615b51
.git/objects/d0
.git/objects/d0/492b368b66bdabf2ac1fd8c92b39d3db916e59
.git/objects/c4
.git/objects/c4/d59f390b9cfd4318117afde11d601c1085f241
~~~
這些文件的內容其實是壓縮的數據外加一個標注類型和長度的頭. 類型可以是塊(blob), 樹(tree), 提交(commit)或者標簽(tag).
最容易找到提交是HEAD提交, 我們可以在.git/HEAD中找到:
~~~
$ cat .git/HEAD
ref: refs/heads/master
~~~
如你所見, 上面的輸出告訴了我們現在在哪個分支之上工作. Git通過創建.git目錄下的文件去標識分支(譯注: 即refs/heads下面的文件, 多個分支會有多個文件). 每個文件中包含了一個提交的SHA1值, 我們可以用cat-file去查看此提交的內容(譯注: 此提交即為該分支的頭):
~~~
$ cat .git/refs/heads/master
c4d59f390b9cfd4318117afde11d601c1085f241
$ git cat-file -t c4d59f39
commit
$ git cat-file commit c4d59f39
tree d0492b368b66bdabf2ac1fd8c92b39d3db916e59
parent 54196cc2703dc165cbd373a65a4dcf22d50ae7f7
author J. Bruce Fields <bfields@puzzle.fieldses.org> 1143418702 -0500
committer J. Bruce Fields <bfields@puzzle.fieldses.org> 1143418702 -0500
add emphasis
~~~
這里的樹對象指向了這棵樹的新狀態:
~~~
$ git ls-tree d0492b36
100644 blob a0423896973644771497bdc03eb99d5281615b51 file.txt
$ git cat-file blob a0423896
hello world!
~~~
父對象指向了前一個提交:
~~~
$ git-cat-file commit 54196cc2
tree 92b8b694ffb1675e5975148e1121810081dbdffe
author J. Bruce Fields <bfields@puzzle.fieldses.org> 1143414668 -0500
committer J. Bruce Fields <bfields@puzzle.fieldses.org> 1143414668 -0500
~~~
- 1. 介紹
- 歡迎使用Git
- GIT對象模型
- Git目錄 與 工作目錄
- Git索引
- 2. 第一步
- 安裝Git
- 安裝與初始化
- 3. 基本用法
- 獲得一個Git倉庫
- 正常的工作流程
- 分支與合并@基礎
- 查看歷史 -Git日志
- 比較提交 - Git Diff
- 分布式的工作流程
- Git標簽
- 4. 中級技能
- 忽略某些文件
- rebase
- 交互式rebase
- 交互式添加
- 儲藏
- Git樹名
- 追蹤分支
- 使用Git Grep進行搜索
- Git的撤消操作 - 重置, 簽出 和 撤消
- 維護Git
- 建立一個公共倉庫
- 建立一個私有倉庫
- 5. 高級技能
- 創建新的空分支
- 修改你的歷史
- 高級分支與合并
- 查找問題的利器 - Git Bisect
- 查找問題的利器 - Git Blame
- Git和Email
- 定制Git
- Git Hooks
- 找回丟失的對象
- 子模塊
- 6. Git生態體系
- Git 與之 Windows
- 使用Git進行系統部署
- 與 Subversion 集成
- 從其他代碼管理工具遷移到Git
- 圖形化的Git
- Git倉庫托管
- Git的其它用法
- Git的腳本支持
- Git 與編輯器
- 7. 原理解析
- Git是如何存儲對象的
- 查看Git對象
- Git引用
- Git索引
- 打包文件
- 更底層的Git
- 傳輸協議
- 術語表