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

本文首發於公衆號「AntDream」,歡迎微信搜索「AntDream」或掃描文章底部二維碼關注,和我一塊兒天天進步一點點git

Git系列

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

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

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

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

objects目錄下的文件

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

而後咱們看看這個文件的內容:post

Git存儲內容的形式

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

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

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

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

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

//咱們先建立一個文件 test.txt ,內容爲 version 1
echo 'version 1' > test.txt
複製代碼

上述命令咱們就建立了一個內容爲 version 1 , 文件名爲 test.txt 的文件,這個時候若是咱們用 git status命令能夠查看當前工程全部狀態(開頭說的3種狀態)的文件信息,以及操做提示,這個是一個頗有用的命令orm

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

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

咱們能夠把內容取出來看看:

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

這就是存儲文件的過程

上述方式有什麼問題?

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

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


歡迎關注個人公衆號查看更多精彩文章!
複製代碼

AntDream
相關文章
相關標籤/搜索