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.

图解:

在.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、查看对象信息

2.1、查看对象的值

git hash-object filename

2.2、查看对象内容

git show <SHA1>

2.3、查看commit历史

$ git log --pretty=oneline

查看commit的内容

git show <SHA1>

2.4、查看commit指向的tree

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

or

$ git cat-file -p   25220245febc99c82463951cf7b0011c25e8399e

3、深入理解git存储

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

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

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

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

查看此commit的内容

3.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的内容

方法2、路径式:

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

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

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

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

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

时间: 2024-10-23 03:46:25

git对象类型及存储结构讲解的相关文章

SQLServer2012 表IAM存储结构探究

SQLServer2012 表IAM存储结构探究 Author:zfive5(zidong) Email: [email protected] 引子 国庆节期间,一直在翻阅<程序员的自我修养-链接.装载与库>,这本给我的感觉是越看越乱,但总的来说还不错,一句话--优秀程序员就应该知道每一个字节的意义. 看此书前的两本<深入解析SQLServer2008>和<Microsoft SQL Server 2005技术内幕:存储引擎>对IAM解读都是点到为止,让我满脑袋是一堆问

5.Git三大对象类型

git三大对象类型 git三大对象类型分别是commit.tree.blobcommit顾名思义是提交的意思,它在git仓库中以快照的形式保存,代表着项目不同的时间节点所对应的内容,Git 可以将项目恢复到任意一个快照tree代表着当前快照内的组织结构,也可看作是文件夹目录blob代表着当前快照内的具体文件对象,git存储方式是以文件内容作为判断,即不同名的相同内容的两个文件只会占用git一份存储空间思考题:新建的Git仓库,有且仅有1个commit,仅仅包含 /doc/readme ,请问该c

数据结构所涉及的数据存储结构类型

大类分别为: 线性表,栈,队列,树,二叉树,图 线性表: 顺序存储结构的定义 typedef struct { ElemType data[maxsize];            //存放顺序表中的元素 int length;                       //存放顺序表的长度 }SqList;                     //顺序表的类型定义 链式存储结构的定义 typedef struct LNode             //定义单链表的节点类型 { Elem

Oracle 数据库 体系结构(一):存储结构

目录 为什么要学习体系结构? 体系结构的定义 Oracle 物理结构 Oracle 逻辑结构 总结 为什么要学习体系结构? 之前的文章有讲解到 MySQL .MongoDB 数据库,这些数据库我们安装好了就能拿来用,比如直接可以做一些:增.删.改.查 等操作.但是 Oracle 的体系错综复杂,如果不了解当中的结构,那么在生产环境中出现一些问题,都不知道是哪个环节有问题,所以需要了解Oracle的结构,这样会更加利于了解它,认识它,如果有问题就会及时知道问题是出现在那一块,就可以及时解决它! >

SQL SERVER大话存储结构(2)

阅读目录(Content) 1 行记录如何存储 1.1 堆表 1.2 聚集索引表格 2 非聚集索引结构 3 非聚集索引键值内容 3.1 堆表上的非聚集索引 3.2 聚集索引表(唯一)的非聚集索引 3.3 聚集索引表(非唯一)的非聚集索引 4 非聚集索引如何查找页 如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有.望各位支持! 本系列上一篇博文链接:SQL SERVER大话存储结构(1)_数据页类型及页面指令分析 回到顶部(go t

SQL SERVER大话存储结构(3)

阅读目录(Content) 1 引入 2 数据行 2.1 数据行结构 2.2 特殊情况(大对象.行溢出及forword) 2.2.1 大对象 2.2.2 行溢出 2.2.3 forword 3 测试存储情况 3.1 堆表分析 3.2 添加主键 3.3 增加一列:可空变长列 3.4 增加一列:非空变长列+默认值 3.4.1 非大对象列 3.5 删除无数据的列 3.6 删除有数据的列 3.7 行溢出 3.8 Forword 4 行结构与DDL 一行数据是如何来存储的呢? 变长列与定长列,NULL与N

字符串和字符串的常见存储结构

继续接去年的常见数据结构和算法总结 系列随笔记录 一.计算机里进行非数值处理的对象基本上是字符串数据,比处理浮点和整数都要复杂 string串定义:由 0 个或多个 字符 组成的 有限的 序列,通常记为:s =“a1 a2 a3 … ai …an”  ( n≥0 ,且n是有限的).其中的引号不属于串,只是一个标记作用! n就是串的长度,且字符串里的字符 ai 的值由 字母.数字或其他字符 组成的. 二.字符串为什么要用双引号标记 作用:避免字符串与变量名或数的常量混淆. char *str =

Oracle存储结构

Oracle数据库的存储结构分为逻辑存储结构和物理存储结构. 一.逻辑存储结构 逻辑存储结构主要描述Oracle数据库的内部存储结构,即从技术概念上描述在Oracle数据库种如何组织.管理数据.因此,逻辑存储结构是和操作系统平台无关的,是由Oracle数据库创建和管理的. 从逻辑上来看. 数据库是由一个或者多个表空间等组成. 一个表空间(tablespace)由一组段组成, 一个段(segment)由一组区组成, 一个区(extent)由一批数据库块组成, 一个数据库块(block)对应一个或多

线性链表其他种类(静态,双向,循环)的存储结构和常见操作

一.静态单链表 在不支持动态空间分配的环境中,要使用链表存储数据,那么可采用静态链表的方法:即在一块预分配的存贮空间中,用下标作为指针链来构成链式结构. //既然是静态链表,那么可以使用一维数组实现存储,java没有指针,那么就用这来使用链表结构 //在不支持动态空间分配的环境中,要使用链式结构技术,可采用静态链表的方法:即在一块预分配的存贮空间中,用下标作为指针. //存储结构:在数组中增加一个“指针”域,存放下一元素在数组中的下标.且0为代表空指针 //设S为SLinkList型变量,若第i