20150917 [學習筆記] Git版本控制(5)
[基本概念] 物件的概念
  • Git 裡的「物件」十分重要,雖然在操作 Git 指令的過程中通常不太需要直接接觸這些檔案,不過了解這些物件的存在,有助於理解 Git 的運作模式與 設計概念。
 
[內容摘要] Git 資料結構
  • (一)物件資料庫
  • (二)物件類型
  • (三)物件結構的優點
 
 
 
 

(一)物件資料庫

  • 「物件」是一種「不可變的」 (immutable) 檔案類型,儲存在「物件儲存區」的檔案只進不出,也不會被修改。
  • [ 原因 ]  如果竄改檔案內容,新的內容運算出來的 SHA1 雜湊值會與原有物件的檔名不一樣,會導致 Git 無法繼續執行。(有保護作用)
  •  
  • 物件(blob 物件與 tree 物件)都會儲存在一個所謂的「物件儲存區」 (object storage) 之中,預設在「儲存庫」的 objects 目錄下:
  • 每一個「物件」,都是以「檔案內容」進行 SHA1 雜湊運算出一個 hash 值,並用這個 hash 值當作物件的名稱。
  • [ 例子1 ]  「檔案內容」: 8a6b275638f3cf164395e65066a1132bb36b7896
  • (1)前兩個字元(8a)當作目錄
  • (2)剩下的值(6b275638f3cf164395e65066a1132bb36b7896)當成檔名
  • (3)這些物件的實體目錄與檔案也都會放在 .git\objects 目錄下,如下圖示:
 
 
 
 

(二)物件類型

[ 參考影片 ] (必看)
 
[ 物件的壓縮 ]  zlib 演算法
  • 提升存取效率。
  • 節省空間 : 計算出 blob 之間的差異,將這些差異儲存在一個名為 packfile 的檔案中。
  • (通常 packfile 會置於 .git\objects\pack 目錄)
  •  
 
[ 物件之間的關聯 ]
  • 透過 tree 物件 (資料夾的快照) 與 commit 物件 (每一個版本的快照) ,能夠得知 blob 與版本的關係。
  • 1.  blob 物件:檔案的"內容"。
  • 工作目錄中某個檔案的 "內容"(當你執行 git add 指令的同時,這些新增檔案的內容就會立刻被寫入成為 blob 物件,檔名則是物件內容的雜湊運算結果)。
 
  • 2.  tree 物件:儲存目錄下的資訊。
  • 包含該目錄下的檔名、對應的 blob 物件名稱、檔案連結(symbolic link) 或其他 tree 物件等等。
  • tree 物件可以包含其他 tree 物件,像「資料夾」。
  • tree 物件是在特定版本下某個資料夾的快照(Snapshot)。