git的底層原理
三段話總結git,
1. 工作原理:git管理是一個DAG有向無環圖,HEAD指針指向branch或直接指向commit,branch指向commit,commit指向tree,tree指向別的tree或直接指向blob。
2. git所管理的一個目錄,幾乎所有相關信息都寫在.git目錄下的子目錄或子文件中。
3. 工作區就是編輯文件和目錄的地方,也就是除過.git目錄之外的,用戶可以顯示編輯的project目錄的文件數據。暫存區(stage)就是.git/index二進制文件和.git/object/目錄下新增加的blob對象,.git/index二進制文件里面保存的是git跟蹤的所有文件的hash值和文件名,包括之前跟蹤的,本次沒有修改過的,也包括本次git add的文件。如果沒有git add,即使工作區有文件新增或修改了,.git/index二進制文件也不會記錄這些,.git/object/目錄下不會新增blob對象。那么git add的目的就是讓工作區發生的修改被記錄到.git/index二進制文件中,而且同時會在.git/object/目錄下產生一個新的存放blob對象的目錄,這個blob在.git/object/目錄下的一個新目錄的文件中,這個文件的名稱是git ls-files --stage看到的hash值,應該是sha1算法算出來的,這個文件里面的內容是二進制數據,用vim打開不能text顯示。然后git commit的時候會產生新的tree和commit對象,HEAD指針會移動,HEAD指針的記錄,和commit的log日志等。所以暫存區可能更應該理解為.git/index文件和.git/object/下的blob對象的存儲,而不僅僅是.git/index文件的更新。
4. 應該可以這樣說,git幾乎所有的配置以及指針、索引等信息都在./git目錄下,git命令調出來的信息都來自于這里面的文件。所以搞清楚git,熟悉git的底層原理和各種操作。應該都可以以這些文件為基礎,這個就有點符合其作者Linus的風格了,和Linux一樣,一切皆文件,越簡單越好,不過度設計,脾氣暴躁,簡單直接,以C語言為基礎,軟件風格也是C語言的感覺。
上面這個圖,要從右向左看
上面這個圖,要從左向右看
git的每次commit都會產生一個校驗和,這個校驗和是通過SHA-1算法算的(Secure Hash Algorithm 1),SHA-1是一種加密散列函數,用于生成數據的唯一固定大小的哈希值。在Git中,這個哈希值用于標識對象(如commit、tree、blob等),保證了數據的完整性和版本的唯一性。
這里順便提一下幾個加密算法的情況
md5sum sha1sumsha256sumsha512sum
算出來的校驗和長度越來越長,也越來越安全。
話說回來,git每一次的commit都會產生一個hash值。這個值是唯一的,相當于保存了每一次提交的目錄樹結構和具體的文件的情況。就比如給一個項目目錄的所有情況打了一個快照。如果要切換到這個狀態,或者使用這個狀態,用hash值作為索引就能找到這個快照。