Git Step by Step (3):Git对象模型
2015-04-21 17:41
337 查看
前面一篇文章介绍了本地仓库的一系列操作,下面我们将进一步了解Git的工作原理,介绍Git对象模型。
刚开始使用Git的时候,对Git对象模型、工作原理并不理解,但是经过一段时间的使用、熟悉之后,然后再来理解这些内容就比较容易了。
下面开始介绍Git对象,然后通过一个实例展示Git对象模型。
在Git系统中有四种类型的对象,所有的Git操作都是基于这四种类型的对象。
“blob”:这种对象用来保存文件的内容。
“tree”:可以理解成一个对象关系树,它管理一些”tree”和 “blob”对象。
“commit”:只指向一个”tree”,它用来标记项目某一个特定时间点的状态。它包括一些关于时间点的元数据,如时间戳、最近一次提交的作者、指向上次提交(初始commit没有这一项)。
“tag”:给某个提交(commit) 增添一个标记。
上面我们介绍了Git对象,在Git系统中,每个Git对象都有一个特殊的ID来代表这个对象,这个特殊的ID就是我们所说的SHA1哈希值。
SHA1哈希值是通过SHA1算法(SHA算法家族的一种)计算出来的哈希值,对于内容不同的对象,会有不同的SHA1哈希值。如果你读过前面一篇文章,就肯定还记得我们是怎么根据commit id撤销更新的,这里的commit id就是一个SHA1哈希值。
下面我们通过一个例子来认识一下上面的四种对象,为了更加清楚,这里将一步步展示经过一系列操作后对象的关系变化。
通过”git log –pretty=raw”可以得到每个commit的SHA1哈希值,也可以得到这个commit对应的tree的哈希值。
所以,一个commit对象一般包含以下信息:
代表commit的哈希值
指向tree 对象的哈希值
作者
提交者
注释
在Git对象模型的研究中,有一个很有用的命令”git cat-file”,可以通过这个命令查询特定对象的信息:
git cat-file -t key:通过一个对象的哈希值可以通过这条命令查看对象的类型(blob、tree、commit或tag)
git cat-file -p key:通过对象的哈希值可以查看这个对象的内容
下面我们看一下在这次提交中commit、tree对象的类型和内容。这里可以看到,在这一次的commit中tree对象的内容指向一个blob对象。
同样,我们可以查看blob对象的类型和内容,这里可以看到blob的内容就是我们要提交的文件的内容。
所以,根据上面的一些数据,我们可以看到在这一次的提交中产生了三个对象,同时看到了commit、tree、blob三个对象的关系如下:
继续使用”git log –pretty=raw”查看commit log。
同样通过”git cat-file”我们可以看到每一个对象的类型和内容,这里就不一步一步上图了,直接给出所有的对象关系。
这里需要注意的一点,Perforce、SVN和CVS属于“增量文件系统” (Delta Storage systems),它们每次只存储提交(commit)之间的差异。而对于Git,它会把你的每次提交的文件的全部内容(snapshot)都会记录下来。
同样的方式,我们可以得到一张更复杂的对象关系图:
Git对象模型就像是Git系统特有的文件系统,以特定的方式存储更新的内容、元数据以及版本历史信息。
通过Git对象模型进一步熟悉了Git的工作原理,相信有了这些知识,我们就可以分析git命令背后到底发生了什么。
刚开始使用Git的时候,对Git对象模型、工作原理并不理解,但是经过一段时间的使用、熟悉之后,然后再来理解这些内容就比较容易了。
下面开始介绍Git对象,然后通过一个实例展示Git对象模型。
Git对象
在Git系统中有四种类型的对象,所有的Git操作都是基于这四种类型的对象。“blob”:这种对象用来保存文件的内容。
“tree”:可以理解成一个对象关系树,它管理一些”tree”和 “blob”对象。
“commit”:只指向一个”tree”,它用来标记项目某一个特定时间点的状态。它包括一些关于时间点的元数据,如时间戳、最近一次提交的作者、指向上次提交(初始commit没有这一项)。
“tag”:给某个提交(commit) 增添一个标记。
SHA1哈希值
上面我们介绍了Git对象,在Git系统中,每个Git对象都有一个特殊的ID来代表这个对象,这个特殊的ID就是我们所说的SHA1哈希值。SHA1哈希值是通过SHA1算法(SHA算法家族的一种)计算出来的哈希值,对于内容不同的对象,会有不同的SHA1哈希值。如果你读过前面一篇文章,就肯定还记得我们是怎么根据commit id撤销更新的,这里的commit id就是一个SHA1哈希值。
Git对象模型实例
下面我们通过一个例子来认识一下上面的四种对象,为了更加清楚,这里将一步步展示经过一系列操作后对象的关系变化。
第一步:新建一个仓库,添加一个”calc.py”的文件
通过”git log –pretty=raw”可以得到每个commit的SHA1哈希值,也可以得到这个commit对应的tree的哈希值。所以,一个commit对象一般包含以下信息:
代表commit的哈希值
指向tree 对象的哈希值
作者
提交者
注释
在Git对象模型的研究中,有一个很有用的命令”git cat-file”,可以通过这个命令查询特定对象的信息:
git cat-file -t key:通过一个对象的哈希值可以通过这条命令查看对象的类型(blob、tree、commit或tag)
git cat-file -p key:通过对象的哈希值可以查看这个对象的内容
下面我们看一下在这次提交中commit、tree对象的类型和内容。这里可以看到,在这一次的commit中tree对象的内容指向一个blob对象。
同样,我们可以查看blob对象的类型和内容,这里可以看到blob的内容就是我们要提交的文件的内容。
所以,根据上面的一些数据,我们可以看到在这一次的提交中产生了三个对象,同时看到了commit、tree、blob三个对象的关系如下:
第二步:更新”calc.py”文件,添加sub函数
继续使用”git log –pretty=raw”查看commit log。同样通过”git cat-file”我们可以看到每一个对象的类型和内容,这里就不一步一步上图了,直接给出所有的对象关系。
这里需要注意的一点,Perforce、SVN和CVS属于“增量文件系统” (Delta Storage systems),它们每次只存储提交(commit)之间的差异。而对于Git,它会把你的每次提交的文件的全部内容(snapshot)都会记录下来。
第三步:增加一个”app.py”;增加”advance”文件夹,包括”__init__.py”和”calc.py”
总结
Git对象模型就像是Git系统特有的文件系统,以特定的方式存储更新的内容、元数据以及版本历史信息。通过Git对象模型进一步熟悉了Git的工作原理,相信有了这些知识,我们就可以分析git命令背后到底发生了什么。
相关文章推荐
- Git Step by Step – (3) Git对象模型
- ActionScript 3.0 Step By Step系列(六):学对象事件模型,从点击按扭开始
- ActionScript 3.0 Step By Step系列(六):学对象事件模型,从点击按扭开始
- ActionScript 3.0 Step By Step系列(六):学对象事件模型,从点击按扭开始
- Caffe使用step by step:使用自己数据对已经训练好的模型进行finetuning
- Git Step by Step – (4) 探索.git目录
- Step by Step Setup Git Server on Windows with CopSSH + msysGit and Integrate Git with Visual Studio
- Git Step by Step
- ngram模型中文语料实验step by step(3)-ngram模型的光滑处理
- Archie OSG Step By Step⑥ 对象选取
- ngram模型中文语料实验step by step(2)-ngram模型数据结构表示及建立
- Git step by step
- Git对象模型
- [Step By Step]SAP HANA PAL多项式回归预测分析Polynomial Regression编程实例POLYNOMIALREGRESSION(模型)
- [Machine Learning step by step][By jy]2.2.1 统计学习:scikit-learn库的设置和估计器对象
- Git Step by Step – (1) Git 简介
- Git Step by Step – (1) Git 简介
- Git Step by Step (4):探索.git目录
- [Step By Step]SAP HANA PAL指数回归预测分析Exponential Regression编程实例EXPREGRESSION(模型)
- OAF二次开发step by step(三)--对具体的BC4J对象的客户化