章節 23 探索 Git 內部: 直接操作 Git 物件

學習目標

現在讓我們使用 git 提供的一些指令來直接查詢 git 物件( .git 中的內容)

查出最新一次的送交01

執行:

git hist --max-count=1

這個指令將會顯示出檔案庫最新的一次送交。您實作中看到的 sha1 hash值可能和範例中的完全不同,不過您也應該看到類似的東西。

輸出:

$ git hist --max-count=1
* 76ba0a7 2012-03-06 | Added a Rakefile. (HEAD, master) [Jim Weirich]

輸出(檢視/傾印/dump)最新的一次送交02

使用上面查到的 SHA1 hash 來觀察物件紀錄的資料 …

執行:

git cat-file -t <hash>
git cat-file -p <hash>

下面是我輸出的資料 …

輸出:

$ git cat-file -t 76ba0a7
commit
$ git cat-file -p 76ba0a7
tree 096b74c56bfc6b40e754fc0725b8c70b2038b91e
parent b8f15c35ac4e42485773fec06e7155203a16c986
author Jim Weirich <jim (at) edgecase.com> 1331068328 -0500
committer Jim Weirich <jim (at) edgecase.com> 1331068328 -0500

Added a Rakefile.

注意: 如果您在前面別名的章節有定義了 ‘type’ 和 ‘dump’ 的別名, 那現在您就可以直接使用git typegit dump,您可以使用它來代替 cat-file,比起使用 cat-file 這比較簡短。(我總是記不住太長的指令XD)

這個物件是 master 分支最近的一次送交(commit),這裡您可以稍微瞭解一下 git 基本上使用 blob, tag, commit, tree 這四種物件型別來分別記錄資料。您可以看出 參數 -t (type) 查到的是該 sha1 hash 的型別,而 -p 參數則記錄了該物件儲存的資料。

查詢樹狀結構 03

我們輸出了這次送交的資料,從記錄中我們看到其實 git 是用 tree 這個物件型別來儲存目錄的檔案結構(樹狀結構),就是這次專案包含了哪些檔案並且個別應該是在哪個子目錄底下。值得注意的是 git 的 tree 型別只有記錄一層的結構(您可以就把它理解成目錄)然後如果需要子目錄那麼這個 tree 裡面就會再有一個 tree 物件。接著我們就用這個 tree 的 SHA1 hash 來觀察所謂的 tree 物件實際上記錄了些什麼。

為了使您可以快速地掌握物件型別的意思,您可以將它想成是一種資料格式。舉例來說 commit 這個資料格式裡面就必須要包含 tree, parent, author , committer 這幾種資料。另外提到的是 commit 的 tree 他指向的就是這個專案最上面一層的目錄。

執行:

git cat-file -p <treehash>

我們的樹狀結構看起來就像這樣…

輸出:

$ git cat-file -p 096b74c
100644 blob 28e0e9d6ea7e25f35ec64a43f569b550e8386f90	Rakefile
040000 tree e46f374f5b36c6f02fb3e9e922b79044f754d795	lib

沒錯,您會看到 Rakefile 和 lib 目錄。這樣是否能比較理解上面所表達的意思。

輸出 lib 目錄 04

執行:

git cat-file -p <libhash>

輸出:

$ git cat-file -p e46f374
100644 blob c45f26b6fdc7db6ba779fc4c385d9d24fc12cf72	hello.rb

這邊就是顯示出 lib 目錄裡( tree )包含了 hello.rb ,另外您可能觀察到 blob 這個東西,是的!他就是 git 用來儲存一般內容檔案的格式,不管是圖片或者word文件都是用這個格式來儲存。

輸出 hello.rb 檔案 05

執行:

git cat-file -p <rbhash>

輸出:

$ git cat-file -p c45f26b
# Default is World
# Author: Jim Weirich (jim@somewhere.com)
name = ARGV.first || "World"

puts "Hello, #{name}!"

到這裡您已經完成了探索並瞭解 git 的一些內部運作的原理,物件型別,然後針對 tree, commit 和 blob 物件去查詢紀錄的資料。

接著您可以到處玩玩看 06

接著您應該試著自己去操作看看,看看您是否能夠掌握上面的原則,自己從 commit 一路手動查詢 SHA1 hash 觀察記錄的資料,然後找到您想確認的那份檔案的內容。

目錄