Git是如何保存和記錄數據的——數據對象

本文首發於公衆號“AntDream”,歡迎微信搜索“AntDream”或掃描文章底部二維碼關注,和我一起每天進步一點點

Git系列

數據對象(blob)——保存文件內容

首先我們先來向Git倉庫中存儲數據

//終端輸入,其中 -w 參數就表示向Git倉庫中寫入
echo 'test content' | git hash-object -w --stdin
//輸出
d670460b4b4aece5915caf5c68d12f560a9fe3e4

上面命令的功能是向Git倉庫中存入 test content ,我們會看到輸出了一串40位長度的內容,而且可以在 objects 目錄下看到一個文件。

objects目錄下的文件

這就是開始時 Git 存儲內容的方式——一個文件對應一條內容,以該內容加上特定頭部信息一起的 SHA-1 校驗和爲文件命名。 校驗和的前兩個字符用於命名子目錄,餘下的 38 個字符則用作文件名。

然後我們看看這個文件的內容:

Git存儲內容的形式

我們會發現這個文件裏面並不是test content,那這個文件內容怎麼就變了呢?

文件內容的存儲過程:
  1. 首先生成一個頭部信息,這個頭部信息由幾部分構成:類型的標記(這裏是blob)、空格、數據內容的長度,最後是一個空字節,比如剛剛的情況就是 “blob 16\u0000”
  2. 頭部信息和原始數據拼接起來,然後計算出 SHA-1 校驗和 ,這樣就得到了上面的一串40位的值
  3. 具體存儲的內容則通過 zlib 壓縮,上面計算出的值前兩位做目錄,後38位做文件名生成文件並寫入,壓縮以後,原來的test content就變成上面圖中的內容了
從Git倉庫把內容取出
//把內容取出來
git cat-file -p 70460b4b4aece5915caf5c68d12f560a9fe3e4
//輸出
test content

上面我們演示的是直接同Git倉庫操作數據,包括存數據取數據,而我們實際開發中,一般都是操作文件,對文件進行版本控制

操作文件——對文件進行版本控制

下面我們來看看Git倉庫是怎麼對文件進行版本控制的

//我們先創建一個文件 test.txt ,內容爲 version 1
echo 'version 1' > test.txt

上述命令我們就創建了一個內容爲 version 1 , 文件名爲 test.txt 的文件,這個時候如果我們用 git status命令可以查看當前工程所有狀態(開頭說的3種狀態)的文件信息,以及操作提示,這個是一個很有用的命令

直接用上面寫入內容的方法向Git倉庫中寫入數據,也就是

//直接向Git中寫入數據
git hash-object -w test.txt
//輸出
83baae61804e65cc73a7201a7252750c76066a30

我們可以把內容取出來看看:

//取出剛剛存的內容
git cat-file -p 83baae61804e65cc73a7201a7252750c76066a30
//輸出
version 1

這就是存儲文件的過程

上述方式有什麼問題?

  • 存儲的內容沒問題,那我的文件名呢?文件名去哪了?
  • 我需要拿回之前的數據,我得記住每一個文件的SHA-1 值,而且是每一個文件每一個版本!

怎麼解決這些問題呢?這就需要Git中的第二個對象—— 樹對象。下一次我們就來看看樹對象


歡迎關注我的公衆號查看更多精彩文章!
AntDream

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