您的位置:首页 > 其它

Git对象模型

2015-01-19 15:25 113 查看

Git对象

在Git系统中有四中类型的对象,所有的Git操作都是基于这四种类型的对象。

"blob":这种对象用来保存文件的内容。

"tree":可以理解成一个对象关系树,它管理一些"tree"和“blob”对象。

"commit":指向一个"tree",它用来标记项目某一个特定时间点的状态。它包括以下关于时间点的元数据,如时间戳、最近一次提交的作者、指向上次提交、

"tag":给某个提交增添一个标记。

SHA1哈希值

在Git系统中,每个Git对象都有一个特殊的ID来代表这个对象,这个特殊的ID就是我们所说的SHA1哈希值。

SHA1哈希值是通过SHA1算法计算出来的哈希值,对于内容不同的对象,会有不同的SHA1哈希值。使用commit id撤销更新,这里的commit id 就是一个SHA1哈希值。

Git对象模型实例

下面我们通过一个例子来认识一下上面的四种对象,为了更加清楚,这里将一步步展示经过一系列操作后对象的关系变化。

第一步:新建一个仓库,添加一个“abc.txt”的文件,并提交到版本库。

通过“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三个对象的关系如下:



第二步:更新“abc.txt”文件,并提交

继续使用“git log --pretty=raw”查看commit log。



同样通过“git cat-file”我们可以看到每一个对象的类型和内容。这里需要注意的一点,Perforce、SVN和CVS属于“增量文件系统”,它们每次只存储提交之间的差异。而对于Git,它会把你每次提交的文件的全部内容都会记录下来。



第三步:增加文件:"log.txt"。增加文件夹“web”,包括“index.html”和“head.jpg”。然后提交。



同样的方式,我们可以得到一张更复杂的对象关系图:



总结

Git对象模型就像是Git系统特有的文件系统,以特定的方式存储更新内容、元数据以及版本历史信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: