git探索

渣渣強發表於2018-07-06

閒話

以前最開始在公司開發程式碼的時候,由於沒有相應的版本庫,基本上每次都是需要自己在本地維護一份程式碼,而且時間久了自己也不會記得。後面慢慢開始使用git作為版本控制,在內部搭建了一套gitlab。

git的版本控制原理

git本身挺強大的,可以多個人不同機器上進行協作開發,提高工作效率。其工作原理都是原來於.git這個目錄。

git探索

其中hook目錄可以定製一些指令碼在合適的事件觸發時呼叫,head和orig_head維護當前位置指標,index是暫存區,objects是記錄著專案涉及的目錄檔案提交等資訊,logs維護各個分支的提交歷史,refs是分支的情況,config是倉庫的配置資訊。

我們考慮一個問題,為什麼我們切換分支的時候,git是如何改變我們當前的版本環境的,這個問題其實我並沒有從程式碼去研究,我只是稍微觀察了下git每次操作後會發生什麼變化。

首先可以觀察下加入我在專案新增一個目錄,然後新增一個檔案,提交到版本庫。 這個時候通過觀察.git目錄的變化,比如我新增一個目錄test2,然後新增一個檔案bbb。

git log

git探索

git show 695df69c9a76 檢視commit與上次commit物件的差別資訊:

git探索

git cat-file -p 695df69c9a76 檢視commit物件內容:

git探索

每個提交對應有一個全域性的目錄結果結果:

git探索
git探索

git cat-file -p 044b7e0fbf70fe3d2ba69439c5812e5f5f0445fd 檢視tree物件,該044b7e0fbf70fe3d2ba69439c5812e5f5f0445fd是從上面目錄結果中獲取到:

git探索

git show f761ec1檢視新檔案物件:

git探索

因此可以看到,git建立一個檔案可以通過log找到需要的commit物件資訊,然後cat-file檢視到其指向tree物件的索引,git通過這些索引可以找到該版本下對應的檔案結構並將檔案還原回去。

git探索

object name的由來

根據git的檔案格式組織好文字,然後計算出文字內容的hash值,將文字格式壓縮後寫入,並按照hash值寫入到object目錄裡面。hash值前兩位作為目錄名。

相關文章