本文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.
圖解:
在.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相對應的目錄::
用命令 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>
2.三、查看commit歷史
$ git log --pretty=oneline
查看commit的內容
git show <SHA1>
2.四、查看commit指向的tree
git rev-parse <SHA1> # 將各類引用表示法轉換爲哈希值等
or
$ git cat-file -p 25220245febc99c82463951cf7b0011c25e8399e
三、深刻理解git存儲
上面介紹了git的數據類型及結構,那他的存儲邏輯結構?
3.一、.git存儲了全部git的數據:
HEAD對應索引,他先索引到master文件,他記錄的是最新的一次commit對象的hash值
3.二、覈實下是否是一個commit對象? (YES)
查看此commit的內容
3.三、一個tree對象和parent對象是關鍵,tree表示了當前commit對象下的全部內容,而parent對象指向了前一個commit對象;
和上圖比較得知,當前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的內容
方法二、路徑式:
3.四、若是想查看前一次commit對象下的數據呢?
方法一、獲取前一次commit對象(HEAD) 的 值
能夠看到和當前的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次的提交回滾