鍍金池/ 教程/ Java/ Git 內(nèi)幕:直接處理 Git 對(duì)象
創(chuàng)建沖突
暫存更改
創(chuàng)建項(xiàng)目
Git 內(nèi)幕:.git 目錄
撤銷本地更改
移動(dòng)文件
移除 oops 標(biāo)簽
何為 Origin
再談結(jié)構(gòu)
撤銷暫存的更改
修正提交
別名
檢查狀態(tài)
給版本打標(biāo)簽
撤銷提交的更改
拉下共享的更改
變基
暫存與提交
合并
合并拉下的更改
更改而非文件
更改原始倉(cāng)庫(kù)
重置 master 分支
回顧克隆的倉(cāng)庫(kù)
變基 VS 合并
共享倉(cāng)庫(kù)
導(dǎo)航分支
重置 greet 分支
添加跟蹤的分支
獲得舊版本
克隆倉(cāng)庫(kù)
Git 內(nèi)幕:直接處理 Git 對(duì)象
再談設(shè)置
遠(yuǎn)程分支
從分支移除提交
合并回 master
查看分叉的分支
添加遠(yuǎn)程倉(cāng)庫(kù)
拉下更改
歷史
在 master 中更改
裸倉(cāng)庫(kù)
做更改
高級(jí)/將來(lái)的主題
推送更改
多個(gè)倉(cāng)庫(kù)
設(shè)置
提交更改
取得更改
托管你的 Git 倉(cāng)庫(kù)
創(chuàng)建分支
解決沖突

Git 內(nèi)幕:直接處理 Git 對(duì)象

目的

瀏覽對(duì)象存儲(chǔ)的結(jié)構(gòu)。學(xué)習(xí)如何使用 SHA1 哈希來(lái)查找倉(cāng)庫(kù)中的內(nèi)容。

現(xiàn)在讓我們使用一些工具來(lái)直接探究 Git 對(duì)象。

查找最新的提交

$ git hist --max-count=1

這應(yīng)當(dāng)顯示倉(cāng)庫(kù)中所做的最新提交。在你的系統(tǒng)中的 SHA1 哈希也許與我的不同,但應(yīng)該看起來(lái)類似。

$ git hist --max-count=1
* 96ee164 2013-04-13 | Added a Rakefile. (HEAD, master) [Jim Weirich]

轉(zhuǎn)存最新的提交

使用上面所列提交的 SHA1 哈希。

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

這兒是我的輸出:

git cat-file -t 96ee164
commit
$ git cat-file -p 96ee164
tree 096b74c56bfc6b40e754fc0725b8c70b2038b91e
parent 0f36766e05bc55d765ec8afe288430edc69fceea
author Jim Weirich <jim (at) neo.com> 1365880844 -0400
committer Jim Weirich <jim (at) neo.com> 1365880844 -0400

Added a Rakefile.

注意:如果你在別名實(shí)驗(yàn)中定義了 typedump 別名,那么你可以輸入 git typegit dump,而不是更長(zhǎng)的 cat-file命令(我從未記住過(guò))。

這是 master 分支頭提交對(duì)象的轉(zhuǎn)存結(jié)果。它看起來(lái)很像先前介紹的提交對(duì)象。

查找 Tree

我們可以轉(zhuǎn)存提交中的目錄樹引用。這應(yīng)當(dāng)是我們項(xiàng)目中的文件的說(shuō)明。使用上面所列“tree”那行的 SHA1 哈希。

$ git cat-file -p <treehash>

這兒是我的目錄樹看起來(lái)的樣子……

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

是的,我看到了 Rakefile 和 lib 目錄。

轉(zhuǎn)存 lib 目錄

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

這是 hello.rb 文件。

轉(zhuǎn)存 hello.rb 文件

$ 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}!"

你已經(jīng)有它了。我們直接從 Git 倉(cāng)庫(kù)轉(zhuǎn)存了提交對(duì)象、樹對(duì)象、以及 blob 對(duì)象。blob、樹及提交就是全部了。

瀏覽你自己的 Git 倉(cāng)庫(kù)

手動(dòng)瀏覽你自己的 Git 倉(cāng)庫(kù)。看看是否能通過(guò)遵循最新提交的 SHA1 哈希引用來(lái)從第一個(gè)提交找出最初的 hello.rb 文件。