git学习小计(四):对象模型

git中会经常出现40位的十六进制数字。所有用来表示项目历史信息的文件,都是通过这些40个字符的“对象名”key(譬如:6ff87c4664981e4397625791c8ea3bbb5f2279a3)来索引的,即key-value对。

每一个“对象名”都是对“对象”内容作SHA1哈希计算得来的。(哈希hash是一种数据摘要算法,或称散列算法,目前应用最广泛的hash算法有MD5和SHA1,SHA1的抗穷举性更好,也是目前最先进的加密技术),

git中每个对象(object)包含三个部分:类型、大小和内容。大小指内容的大小,内容取决于对象的类型,有四种类型:“bold”、"tree"、"commit"、"tag"。

  • “bold”用来存储文件数据,通常是一个文件。
  • “tree”有点像一个目录,它有一串指向“bold”对象或者是其他“tree”对象的key,一般用来表示内容之间的目录层次关系。
  • “commit”用来比较项目某一特定时间点的状态,或者说提交点,每个commit唯一指向一个“tree”
  • “tag”是用来标记某一个提交(commit)的方法
这些对象存储在Git库中的.object目录下,ID的前两位作为目录名,后38位作为文件名。
几乎所有的Git的功能都是使用这四个简单的对象类型来完成的。它就像是在本机的文件系统上构建了一个小的文件系统。
研究git的一个重要的命令就是:git cat-file。 查看对象类型使用:git cat-file -t objectID,而查看对象的内容为:git cat-file -p objectID。当然你没有必要把40位的ID写全,一般只要写5位保证不冲突就行。git cat-file -p head:test.java,不做介绍了,一看就明白。
可以通过git show来查看对象中的内容。blob对象推荐使用git show,但是git ls-tree能看到更多的关于tree的细节。
可以用:
git log --pretty=raw --graph objectID
git show --pretty=raw --graph objectID
来查看某个commit(--graph可以显示成树形,--pretty=raw显示commit对象中的整个提交信息),譬如


可以看到,一个commit由以下内容组成:
  • tree          tree对象的SHA1
  • parent     父commit对象的SHA1,一般父对面只有一个,但合并的提交(merge commits)可能会有不只一个父对象。如果一个提交没有父对象,那么它就是“根提交”(root commit),它代表着项目最初的版本,每个项目必须至少有一个root commit,一个项目可能有多个root commit,但不推荐!
  • author     此次修改的作者的名字、修改日期等信息
  • committer  提交人的名字、修改日期等信息,可与author不同,譬如author写了一个patch并把它mail给committer,由committer来创建commit
一般用git commit来创建一个提交(commit)。
blob结构:          tree结构:    commit结构:
所以根据commit对象之间的相互关联,从任意一commit建立一条历史跟踪链,直至最后一个没有parent属性的commit,跟踪链到此为止,这实际上就是整个提交的起点。
附上一副图:




head代表版本库中最近一次的commit, ^用于指代父commit,例如:head^代表版本库中的上次commit,即最近一次commit的父commit,自然head^^代表head^的父commit。而祖先提交如果都用head^^^^^……来表示将极不方便,故提供这种用法:head~n。对于一个commit有多个父commit的情况,可在^后面用数字表示是第几个父commit,如head^2表示head的多个父commit中的第二个commit。(这里所有的head都可用任一commit来替换,含义一样)











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值