git数据存储结构

时间:2024-04-02 17:39:13

        以前的存储仓库,采用针对改变的文件进行标记,对每个文件进行跟踪。文件改变就会记录。git采用对version进行跟踪,将改变的文件记录下来,每一版本记录一次,没有改变的文件使用上一版本的,这样存储速度快,在你上传远程的时候,也是很快的,并且在你本地也是一个仓库,每人都是分布式仓库,代码安全性高。

 

接下来看看git的文件存储结构吧。

一、git的基本对象类型

二、查看git对象信息

三、理解git存储结构

 

1、Git中有四种基本对象类型,组成了Git更高级的数据结构:

  • blobs
    每个blob代表一个(版本的)文件,blob只包含文件的数据,而忽略文件的其他元数据,如名字、路径、格式等。

  • trees
    每个tree代表了一个目录的信息,包含了此目录下的blobs,子目录(对应于子trees),文件名、路径等元数据。因此,对于有子目录的目录,git相当于存储了嵌套的trees。

  • commits
    每个commit记录了提交一个更新的所有元数据,如指向的tree,父commit,作者、提交者、提交日期、提交日志等。每次提交都指向一个tree对象,记录了当次提交时的目录信息。一个commit可以有多个(至少一个)父commits。

  • tags
    tag用于给某个上述类型的对象指配一个便于开发者记忆的名字, 通常用于某次commit。

名词1、

对应当前的状态下的最后一次提交。HEAD对应索引,而非分支。同理FETCH_HEAD.

图解:

git数据存储结构

 

2、查看对象信息

2.1、查看对象的值

1

git hash-object filename

2.2、查看对象内容

1

git show <SHA1>

git数据存储结构

2.3、查看commit历史

1

$ git log --pretty=oneline

git数据存储结构

查看commit的内容

1

git show <SHA1>

git数据存储结构

2.4、查看commit指向的tree

git rev-parse <SHA1> # 将各种引用表示法转换为哈希值等

or

1

$ git cat-file -p   25220245febc99c82463951cf7b0011c25e8399e

git数据存储结构

3、深入理解git存储

    上面介绍了git的数据类型及结构,那他的存储逻辑结构?

3.1、.git存储了所有git的数据:

git数据存储结构

HEAD对应索引,他先索引到master文件,他记录的是最新的一次commit对象的hash值

git数据存储结构

3.2、核实下是不是一个commit对象?  (YES)

git数据存储结构

查看此commit的内容

git数据存储结构

3.3、一个tree对象和parent对象是关键,tree表示了当前commit对象下的所有内容,而parent对象指向了前一个commit对象;

git数据存储结构

和上图比较得知,当前parent对象的hash和前一次的commit的hash是一致的;

如果想看前三次的commit的值呢?

1

2

$ git rev-parse HEAD~3

445996a2fdbfbda904b030d7ab12ba19579669b8

查看当前commit下的tree的内容,也就是blob的内容

方法1、一级级的往下寻找git的hash值

1

2

3

$ git cat-file -p 252202    #查看当前commit对象下的内容

$ git cat-file -p b1ca8027d72b7  #查看当前commit对象下的tree的内容

$ git show 5e3c993fc7     #查看当前commit对象下的tree下面的具体某个blob的内容

git数据存储结构

方法2、路径式:

git数据存储结构

3.4、如果想查看前一次commit对象下的数据呢?

方法1、获取前一次commit对象(HEAD) 的 值

git数据存储结构

可以看到和当前的commit是少了一个test目录,而文件是没有变化的;

方法二:查看文件的也是一样的路径方式:

1

2

3

[email protected] /D/User/leo/Desktop/git/.git (GIT_DIR!)

$ git show HEAD~:hello.rb

puts "hello world!"

 

Tips:既然知道了存储结构,那想代码回滚到前一次的状态怎么办?(将当前的commit恢复到前一次)

方法1、git reset --hard commit-id :回滚到commit-id,讲commit-id之后提交的commit都去除

方法2、git reset --hard HEAD~2:将最近3次的提交回滚

git数据存储结构