本文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次的提交回滚