git对象类型及存储结构讲解

简介:

本文git版本1.9.6


一、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.

图解:

wKiom1RV01mhfTD2AAGqihwodD4244.jpg

在.git/objects/中存储了所有的对象,如用命令

1
2
3
4
5
6
7
8
9
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值的前两个数字来分目录存储对象,因此上述对象分别为

1
2
3
033faad6dd01bd59594f447f159b307553d87db9
0fe9ab15a2da28c2cdef6c4f92a1ff0067424f8e
。。。。。。

而在objects相对应的目录::

wKioL1RV1O_SUVHyAAFDCgMV3R4700.jpg

用命令  git cat-file  可以分别查看对象的值和内容。一般地,使用SHA1值的前面几位(无需全部)就可以区分不同的对象,因此上述命令中可以用如git cat-file -t 033faa

1
2
git  cat - file  -t <SHA1>        #查看对象的值
git  cat - file  -p <SHA1>        #查看对象的内容

2、查看对象信息

2.1、查看对象的值

1
git  hash -object filename

2.2、查看对象内容

1
git show <SHA1>

wKioL1RV19HjRoTmAAHHBwQB65U227.jpg

2.3、查看commit历史

1
$ git log --pretty=oneline

wKioL1RV2TCQuXH4AAJWb-09qrg733.jpg

查看commit的内容

1
git show <SHA1>

wKioL1RV5NWDxjD9AAFWPL-y4NY176.jpg

2.4、查看commit指向的tree

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

or

1
$ git  cat - file  -p   25220245febc99c82463951cf7b0011c25e8399e

wKioL1RV5ePxuOeDAAJ_5gvv54U413.jpg

3、深入理解git存储

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

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

wKioL1RV66ui1n59AAFGxrMxeSU277.jpg

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

wKiom1RV7BGSHHMCAAIvcEfiqGs921.jpg

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

wKioL1RV7M_hQzuvAAB8ERAohwk580.jpg

查看此commit的内容

wKioL1RV7P_xwTShAAFfA6VA2NM725.jpg

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

wKioL1RV7beziLqAAAEYqc7rdqI283.jpg

和上图比较得知,当前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的内容

wKioL1RV736A2ZIXAAO0PM8y4SI383.jpg

方法2、路径式:

wKiom1RV74mxUkDtAAGBXMWUHXo774.jpg

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

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

wKioL1RV8pjSTWcKAAMR_facrSw857.jpg

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

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

1
2
3
Aries@ARIES-PC  /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次的提交回滚

wKiom1RV9RKDBa2oAAKv_soo4vY319.jpg


本文转自 西索oO 51CTO博客,原文链接:http://blog.51cto.com/lansgg/1570942


相关文章
|
2月前
|
存储 项目管理 开发工具
如何使用 Git Clean 清理 Git 存储库?
【4月更文挑战第9天】
443 9
如何使用 Git Clean 清理 Git 存储库?
|
11月前
|
存储 开发工具 git
如何从Git存储库中删除不想要的信息(超详细)
如何从Git存储库中删除不想要的信息(超详细)
209 0
|
存储 开发工具 git
GIT:git stash临时存储代码
GIT:git stash临时存储代码
148 0
|
存储 数据可视化 Java
Spring Cloud Config采用Git存储时两种常用的配置策略
Spring Cloud Config采用Git存储时两种常用的配置策略
127 0
|
存储 开发工具 git
本地git部署web连接azure的git存储库
​​​本地git部署web 创建本地存储仓库 输入以下命令创建git本地仓库(会在当前目录下生产一个.git的目录) git init 然后提交内容 在git仓库所在的目录下存放好需要的网页文件 将文件添加到存储库中 git add -A 将代码提交到代码仓库 -m 一般用作标注此次提交的代码内容 git commit -m "azure web" 在azure中开启git存储库 登录到 Azure 经典管理门户。
1581 0
|
25天前
|
存储 网络安全 开发工具
【GIT】Git常用命令学习
【GIT】Git常用命令学习
30 1
|
2月前
|
Shell 网络安全 开发工具
GIT常用命令
GIT常用命令
|
7天前
|
Shell 网络安全 开发工具
最常用的git命令(一整套)
```md # Git源代码迁移步骤: 1. 生成SSH公钥 (`ssh-keygen`) 并添加至个人Git配置。 2. 克隆旧仓库镜像 (`git clone --mirror`)。 3. 切换到镜像目录,设置新仓库URL (`git remote set-url origin`)。 4. 推送镜像到新仓库 (`git push --mirror`)。 5. 检出分支,合并 (`git checkout`, `git pull`, `git merge`, `git push`)。
20 3
|
5天前
|
开发工具 git
GIT日常命令收集
这些命令是GIT日常操作中常用的,但GIT的功能远不止这些,更多高级功能需要通过学习和实践来掌握。
7 0