Git有四大組件,分別是:java
當git初始化後,目錄下就生成了.git文件夾,存放着與git相關的全部內容,咱們看下目錄下具體的內容:git
全部的組件都存放在objects文件夾中:微信
當咱們執行git add README.md
後,文件夾內容以下:spa
咱們能夠看到,目錄中多了83目錄,即blog組件,83目錄中有文件名是一串UUID的文件,當咱們執行git add將文件變爲staged狀態後,就會在objects目錄建立一個組件,組件都是以hash的二進制方式進行存儲,組件的名稱爲文件夾名稱+文件名稱,全部上面的blob組件的名字即爲83920ba13f0cd4e0046337313c1f0a1cfc676ad4
,這個名字是惟一的。3d
當修改README.md後再次執行git add,發現,objects目錄中又多了一個blob組件:日誌
注意:若是兩個文件的內容同樣的話,執行git add的時候,只會生成一個blob組件,不會是兩個。blob組件是在代碼提交到Stage區域的時候生成的,並且是之內容來生成一個字節碼文件。code
能夠經過git hash-object來查詢文件的hash碼:cdn
剛剛咱們已經執行了兩次git add,下面咱們將變更提交,執行git commit:blog
git commit -m "init"
複製代碼
能夠看到,objects中多了兩個文件夾,b6和da,這兩個是什麼呢?咱們先用git log查看下提交日誌:string
能夠看到,commit的id爲da7b2dd822e576db1cfb0e546a9de57fc8cfbe8b
,因此da文件夾爲commit組件,那麼b6是什麼呢?
b6是tree組件,每次commit時,首先會建立commit組件,而後將涉及的文件信息建立tree組件,咱們能夠用git cat-file -p命令查看commit組件:
能夠看到,經過git cat-file -p命令查看commit組件,能夠看到tree組件,咱們用git cat-file -p來查看tree組件:
能夠看到,tree組件中記錄了文件的基本信息。
咱們總結下git底層的運行流程:
咱們看到,git的整個過程都是以hash和二進制進行操做,因此git執行效率很是之高。