git存盤結構
- 一、分層結構
- 二、Git物件
- 目錄結構
- 演示
- 三、執行程序
參考文章:git內部原理
git 是一套內容尋址檔案系統,從內部來看,git 是簡單的 key-value 資料存盤,它允許插入任意型別的內容,并會回傳一個鍵值,通過該鍵值可以在任何時候再取出該內容,
一、分層結構

git的作業總共分四層,其中三層是在自己本地的git倉庫,包括了作業目錄,暫存區和本地倉庫,作業目錄就是我們執行命令git init時所在的地方,也是執行一切檔案操作的地方,暫存區和本地倉庫都是在.git目錄,因為它們只是用來存資料的,遠程倉庫在中心服務器,也就是我們做好作業之后推送到遠程倉庫,或者從遠程倉庫更新下來最新代碼到我們的git倉庫,git所存盤的都是一系列的檔案快照,然后git來跟蹤這些檔案快照,發現哪個檔案快照有變化它就會提示你需要添加到暫存區或是提交到本地倉庫來保證你的作業目錄是干凈的,
這個怎么理解呢,git中的檔案有兩種狀態,一種是被跟蹤的,也就是提交到本地倉庫的檔案,因為本地倉庫要保管它們,所以得跟蹤他們,第二種未被跟蹤的,那么當我們添加新的檔案時,它不是被跟蹤的,因為本地倉庫里面沒有這個檔案,它是外來的,在git commit之前本地倉庫還不需要對他們負責,但是如果是對倉庫已經存在的檔案進行修改,那么這些檔案就是被跟蹤的檔案,就可以通過git status查看他們的狀態來進行相應的操作,當然我們也可以生成一個.gitignore檔案,里面指定要忽略的檔案型別,然后這些檔案就不會被跟蹤,也不會被提交,
在作業目錄中進行檔案操作后,要先添加到暫存區,然后再將暫存區中剛添加的檔案快照提交到本地倉庫,然后再將本地倉庫的最新版本檔案快照推送到遠程倉庫,這個檔案快照其實就是各個檔案的在被添加到暫存區時的狀態,就和照相一樣的,留下每個不同時刻的快照,方便以后查詢,而git存盤的就是這些一系列的快照,說到這個快照就要說說git的物件了,
二、Git物件
目錄結構
????從根本上講,git是一套內容尋址的檔案系統,它存盤的也是key-value鍵值對,然后根據key值來查找value的,說到尋址就會想到指標,git也是根據指標來尋址的,這些指標就存盤在git的物件中,git一共有3種物件,commit物件,tree物件和blob物件,

????blob是最小的存盤單元,對應的就是檔案快照中那些發生變化的檔案內容;tree物件則記錄了檔案快照中各個目錄和檔案的結構關系,它指向了被跟蹤的快照;commit物件則記錄了每次提交到本地倉庫的檔案快照,
從上圖看出commit會有兩個指標,一個指向tree物件,一個則指向上一個commit物件,在開發程序中,我們會提交很多次檔案快照,那么第一次提交的內容會用一個commit來記錄,這個commit沒有指標指向上一個commit物件,因為沒有上一個commit,它是第一個,當第二次提交時,又會有另外一個commit物件來記錄,那么這次commit物件中就會有一個指標指向上一次提交后的commit物件,經過很多次提交后就會有很多的commit物件,它們組成了一個鏈表,當我們要恢復哪個版本的時候,只要找到這個commit物件就能恢復那個版本的檔案,而我們所謂的HEAD物件其實就指向最近一個提交的commit物件,也就是最后一個commit物件,
演示
- 所有的提交都存盤在這兩個檔案夾

- 洗掉hooks便于觀察(rm -rf .git/hooks)

- add到暫存區后會生成對應的hash值

- 查看add的檔案型別為blob

- 輸出blob中的內容

- commit之后.git檔案下會再次生成兩個檔案,一個是tree、一個是commit記錄

- 三個檔案型別如下,檔案的內容

- 修改1.txt中的內容再次commit,還會生成一組commit、tree、blob
commit(作者、資訊、上一個commit的指標) > Tree(檔案名稱、檔案內容) > blob(提交的資料),如下所示:
commit:它儲存的是一個提交的資訊,包括對應目錄結構的快照tree的哈希值,上一個提交的哈希值(這里由于是第一個提交,所以沒有父節點,在一個merge提交中還會出現多個父節點),提交的作者以及提交的具體時間,最后是該提交的資訊,
Tree:從它儲存的內容來看可以發現它儲存了一個目錄結構(類似于檔案夾),以及每一個檔案(或者子檔案夾)的權限、型別、對應的身份證(SHA1值)、以及檔案名
blob:它只儲存的是一個檔案的內容,不包括檔案名等其他資訊,然后將這些資訊經過SHA1哈希演算法得到對應的哈希值:a8b136da1d43a350901e4131bae78826d193d8,作為這個object在Git倉庫中的唯一身份證,
三、執行程序

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/122870.html
標籤:其他
