Git 追蹤內容詳解
Git不僅僅是一個版本管理系統,同時還是一個內容追蹤系統,Git 的內容追蹤主要表現為兩種關鍵的方式:
第一種方式:
Git的物件庫不是基於使用者檔案佈局的檔名或目錄名設定,而是基於其物件的SHA1雜湊值來設定。當Git存放一個檔案到物件庫的時候,它是基於檔案內容的SHA1雜湊值,而不是根據物件的檔名。因此,Git 並不跟蹤與檔案相關的檔名和目錄名,而是跟蹤的是檔案的內容。
Git根據檔案的內容來計算該檔案的SHA1雜湊值,如果兩個檔案的內容完全一樣,那它們的SHA1值是相同的,反過來說,如果兩個檔案的SHA1雜湊值是相同的,那麼它們的內容是完全一樣的。
如果兩個檔案中的內容完全一樣,無論它們是否在相同的目錄中,Git 在物件庫中只保留一份blob物件副本,並以SHA1雜湊值作為索引,這兩個檔案都使用該blob物件指代檔案內容。
如果版本庫中的某一檔案內容發生變化,Git會根據它的內容計算一個新的SHA1雜湊值,識別出這是一個不同的blob物件,然後把這個新的blob物件新增到物件庫中。原來的blob物件在物件庫裡不變,繼續為沒有變化的檔案使用。
第二種方式:
由於Git使用一個檔案的全部內容的SHA1雜湊值作為檔案的索引,Git必須對每個檔案的完整副本進行操作,而不能將物件庫條目獎勵在檔案內容的一部分揮著檔案的兩個版本之間的差異上。當檔案從一個版本變化到下一個版本時,Git的內部資料庫有效地儲存每個檔案的每個版本,而不是檔案在兩個版本之間的差異。
Git用不同SHA1雜湊值的blob之間的區別來計算這個歷史,而不是直接儲存一個檔名和一系列的差異。
問題:
直接儲存每個檔案每個版本的完整內容是否太低效?
如果只新增或改變一行是不是要儲存兩個版本的全部內容?
答案:
不是,不完全是!具體講解請看下一篇部落格《Git 打包檔案》,連結地址: