git原理及git對象詳解

  首先,要理解git底層原理必須知道git的三個對象:blob、tree以及commit,所有對象存儲在.git\objects路徑下

  1. blob對象,在add操作後生成,記錄的是文件的內容,文件名爲文件內容的hash值,需要注意的是如果文件內容一樣只會有一個blob文件顯示,如果文件沒內容也不會生成blob對象。
  2. tree對象,在commit操作後生成,tree對象包含blob對象,如果文件時存儲在文件夾中(既存在目錄,一個目錄是一個tree對象),那麼還會包含子tree對象,與tree對象是無區別,在這個子tree對象中又會包含blob對象以及一些文件的元數據信息。
  3. commit對象,在commit操作後生成,commit對象包含tree對象、父commit對象、一些文件的元數據信息及commit message。

   如圖所示: 

  在這張圖圖中,git指針的概念就很清晰了,首先,當你commit之後,commit的指針就指向一個tree對象, tree對象存在文件的話,指針直接指向這個文件的blob對象,blob對象就指向了文件的內容,所以,add到暫存區跟commit到本地倉庫的其實不是實體的文件,而是這三個對象。

 

 

 

  關於分支的切換原理也就是指針指向的轉換,在.git\refs\heads路徑下,每個文件的名字就是分支的名字,文件的內容爲commit_id,指向一個commit對象,git會自己維護這個HEAD指針,在git1\.git目錄下的HEAD文件,裏面的內容就爲.git\refs\heads的分支文件路徑,如圖所示,只需將HEAD指針指向不同分支即可。

  總的來說,git將文件的各種元數據信息(文件名、大小、內容。。。)轉化爲三個對象進行存儲,通過指針的方式,控制分支的切換及各個區域的回退。 (tip:git是基於元數據操作的,而svn則是基於文件操作的)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章