如何克服解決Git衝突的恐懼症?(Git四大組件)

Git存儲結構

Git有四大組件,分別是:java

  • Tag
  • Commit
  • Tree
  • Blob

當git初始化後,目錄下就生成了.git文件夾,存放着與git相關的全部內容,咱們看下目錄下具體的內容:git

全部的組件都存放在objects文件夾中:微信

Blob組件

當咱們執行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

Commit組件

剛剛咱們已經執行了兩次git add,下面咱們將變更提交,執行git commit:blog

git commit -m "init"
複製代碼

能夠看到,objects中多了兩個文件夾,b6和da,這兩個是什麼呢?咱們先用git log查看下提交日誌:string

能夠看到,commit的id爲da7b2dd822e576db1cfb0e546a9de57fc8cfbe8b,因此da文件夾爲commit組件,那麼b6是什麼呢?

Tree組件

b6是tree組件,每次commit時,首先會建立commit組件,而後將涉及的文件信息建立tree組件,咱們能夠用git cat-file -p命令查看commit組件:

能夠看到,經過git cat-file -p命令查看commit組件,能夠看到tree組件,咱們用git cat-file -p來查看tree組件:

能夠看到,tree組件中記錄了文件的基本信息。

底層運行流程

咱們總結下git底層的運行流程:

  • 當咱們添加或者修改了文件而且add到stage區以後,會根據文件內容建立不一樣的blob
  • 當進行提交以後立刻建立一個tree組件把須要的blob組件添加進去,以後再封裝到一個commit組件中完成本次提交。
  • 在未來進行reset的時候能夠直接使用git reset --hard xxxxx能夠恢復到某個特定的版本
  • 在reset以後,git會根據這個commit組件的id快速的找到tree組件,而後根據tree找到blob組件,以後對倉庫進行還原

咱們看到,git的整個過程都是以hash和二進制進行操做,因此git執行效率很是之高。

微信公衆號: 碼上論劍
請關注個人我的技術微信公衆號,訂閱更多內容
相關文章
相關標籤/搜索