閒話
以前最開始在公司開發程式碼的時候,由於沒有相應的版本庫,基本上每次都是需要自己在本地維護一份程式碼,而且時間久了自己也不會記得。後面慢慢開始使用git作為版本控制,在內部搭建了一套gitlab。
git的版本控制原理
git本身挺強大的,可以多個人不同機器上進行協作開發,提高工作效率。其工作原理都是原來於.git這個目錄。
其中hook目錄可以定製一些指令碼在合適的事件觸發時呼叫,head和orig_head維護當前位置指標,index是暫存區,objects是記錄著專案涉及的目錄檔案提交等資訊,logs維護各個分支的提交歷史,refs是分支的情況,config是倉庫的配置資訊。
我們考慮一個問題,為什麼我們切換分支的時候,git是如何改變我們當前的版本環境的,這個問題其實我並沒有從程式碼去研究,我只是稍微觀察了下git每次操作後會發生什麼變化。
首先可以觀察下加入我在專案新增一個目錄,然後新增一個檔案,提交到版本庫。 這個時候通過觀察.git目錄的變化,比如我新增一個目錄test2,然後新增一個檔案bbb。
git log
git show 695df69c9a76 檢視commit與上次commit物件的差別資訊:
git cat-file -p 695df69c9a76 檢視commit物件內容:
每個提交對應有一個全域性的目錄結果結果:
git cat-file -p 044b7e0fbf70fe3d2ba69439c5812e5f5f0445fd 檢視tree物件,該044b7e0fbf70fe3d2ba69439c5812e5f5f0445fd是從上面目錄結果中獲取到:
git show f761ec1檢視新檔案物件:
因此可以看到,git建立一個檔案可以通過log找到需要的commit物件資訊,然後cat-file檢視到其指向tree物件的索引,git通過這些索引可以找到該版本下對應的檔案結構並將檔案還原回去。
object name的由來
根據git的檔案格式組織好文字,然後計算出文字內容的hash值,將文字格式壓縮後寫入,並按照hash值寫入到object目錄裡面。hash值前兩位作為目錄名。