git對象類型及存儲結構講解

本文git版本1.9.6git


1、git的基本對象類型bash

2、查看git對象信息數據結構

3、理解git存儲結構
ide


一、Git中有四種基本對象類型,組成了Git更高級的數據結構:ui

  • blobs
    每一個blob表明一個(版本的)文件,blob只包含文件的數據,而忽略文件的其餘元數據,如名字、路徑、格式等。spa

  • trees
    每一個tree表明了一個目錄的信息,包含了此目錄下的blobs,子目錄(對應於子trees),文件名、路徑等元數據。所以,對於有子目錄的目錄,git至關於存儲了嵌套的trees。3d

  • commits
    每一個commit記錄了提交一個更新的全部元數據,如指向的tree,父commit,做者、提交者、提交日期、提交日誌等。每次提交都指向一個tree對象,記錄了當次提交時的目錄信息。一個commit能夠有多個(至少一個)父commits。日誌

  • tags
    tag用於給某個上述類型的對象指配一個便於開發者記憶的名字, 一般用於某次commit。對象

名詞一、blog

對應當前的狀態下的最後一次提交。HEAD對應索引,而非分支。同理FETCH_HEAD.

圖解:

wKiom1RV01mhfTD2AAGqihwodD4244.jpg

在.git/objects/中存儲了全部的對象,如用命令

$ find .git/objects -type f
.git/objects/03/3faad6dd01bd59594f447f159b307553d87db9
.git/objects/0f/e9ab15a2da28c2cdef6c4f92a1ff0067424f8e
.git/objects/13/be0240b1698df5f5d53123b3ac59cceb4b3ee0
.git/objects/17/533d40936b9abc18577b2c940c083031d4a27c
.git/objects/17/eb2d95ca405ce1005ebb7274e995cfbad1e43b
.git/objects/1a/fd63e52c13dac81819b55d3e56272e0e930552
.git/objects/1c/59540ce36561075575652b8642eb40406f9e6a
.git/objects/25/01ab8ba1f7c3dbf91023cb8c39592b9808ab5c

git用SHA1值的前兩個數字來分目錄存儲對象,所以上述對象分別爲

033faad6dd01bd59594f447f159b307553d87db9
0fe9ab15a2da28c2cdef6c4f92a1ff0067424f8e
。。。。。。

而在objects相對應的目錄::

wKioL1RV1O_SUVHyAAFDCgMV3R4700.jpg

用命令  git cat-file  能夠分別查看對象的值和內容。通常地,使用SHA1值的前面幾位(無需所有)就能夠區分不一樣的對象,所以上述命令中能夠用如git cat-file -t 033faa

git cat-file -t <SHA1>       #查看對象的值
git cat-file -p <SHA1>       #查看對象的內容

二、查看對象信息

2.一、查看對象的值

git hash-object filename

2.二、查看對象內容

git show <SHA1>

wKioL1RV19HjRoTmAAHHBwQB65U227.jpg

2.三、查看commit歷史

$ git log --pretty=oneline

wKioL1RV2TCQuXH4AAJWb-09qrg733.jpg

查看commit的內容

git show <SHA1>

wKioL1RV5NWDxjD9AAFWPL-y4NY176.jpg

2.四、查看commit指向的tree

git rev-parse <SHA1> # 將各類引用表示法轉換爲哈希值等

or

$ git cat-file -p   25220245febc99c82463951cf7b0011c25e8399e

wKioL1RV5ePxuOeDAAJ_5gvv54U413.jpg

三、深刻理解git存儲

    上面介紹了git的數據類型及結構,那他的存儲邏輯結構?

3.一、.git存儲了全部git的數據:

wKioL1RV66ui1n59AAFGxrMxeSU277.jpg

HEAD對應索引,他先索引到master文件,他記錄的是最新的一次commit對象的hash值

wKiom1RV7BGSHHMCAAIvcEfiqGs921.jpg

3.二、覈實下是否是一個commit對象?  (YES)

wKioL1RV7M_hQzuvAAB8ERAohwk580.jpg

查看此commit的內容

wKioL1RV7P_xwTShAAFfA6VA2NM725.jpg

3.三、一個tree對象和parent對象是關鍵,tree表示了當前commit對象下的全部內容,而parent對象指向了前一個commit對象;

wKioL1RV7beziLqAAAEYqc7rdqI283.jpg

和上圖比較得知,當前parent對象的hash和前一次的commit的hash是一致的;

若是想看前三次的commit的值呢?

$ git rev-parse HEAD~3
445996a2fdbfbda904b030d7ab12ba19579669b8

查看當前commit下的tree的內容,也就是blob的內容

方法1、一級級的往下尋找git的hash值

$ git cat-file -p 252202    #查看當前commit對象下的內容
$ git cat-file -p b1ca8027d72b7  #查看當前commit對象下的tree的內容
$ git show 5e3c993fc7     #查看當前commit對象下的tree下面的具體某個blob的內容

wKioL1RV736A2ZIXAAO0PM8y4SI383.jpg

方法二、路徑式:

wKiom1RV74mxUkDtAAGBXMWUHXo774.jpg

3.四、若是想查看前一次commit對象下的數據呢?

方法一、獲取前一次commit對象(HEAD) 的 值

wKioL1RV8pjSTWcKAAMR_facrSw857.jpg

能夠看到和當前的commit是少了一個test目錄,而文件是沒有變化的;

方法二:查看文件的也是同樣的路徑方式:

Aries@ARIES-PC /D/User/leo/Desktop/git/.git (GIT_DIR!)
$ git show HEAD~:hello.rb
puts "hello world!"


Tips:既然知道了存儲結構,那想代碼回滾到前一次的狀態怎麼辦?(將當前的commit恢復到前一次)

方法一、git reset --hard commit-id :回滾到commit-id,講commit-id以後提交的commit都去除

方法二、git reset --hard HEAD~2:將最近3次的提交回滾

wKiom1RV9RKDBa2oAAKv_soo4vY319.jpg

相關文章
相關標籤/搜索