Git对象库
git log -1 --pretty=raw
结果:
commit 2443ae29d86ec5edd6fbb70e2a01f1902dd02a37
tree 5313f2996a91501b2e79e4a93476132904e4082e
parent eef995dc79c6e5717942a19494a2ad3e02fbf8a5
author 17305 <guoxi.zhang@hand-china.com> 1540029427 +0800
committer 17305 <guoxi.zhang@hand-china.com> 1540029427 +0800
which version checked in
包含了三个SHA1哈希值表示的对象ID:
commit 2443ae29d86ec5edd6fbb70e2a01f1902dd02a37
表示本次提交的唯一标识
tree 5313f2996a91501b2e79e4a93476132904e4082e
表示本次提交对应的目录树
parent eef995dc79c6e5717942a19494a2ad3e02fbf8a5
表示本地提交的父提交(上一次提交)
研究Git对象一个重要的命令是git cat-file
git cat-file -t <commit>
查看对象的类型
例如
-
git cat-file -t 2443ae
--------------------------------->commit -
git cat-file -t 5313f2
---------------------------------->tree -
git cat-file -t eef995
---------------------------------->commit
git cat-file -p <commit>
查看对象的内容
例如
-
git cat-file -p 2443ae
结果
tree 5313f2996a91501b2e79e4a93476132904e4082e
parent eef995dc79c6e5717942a19494a2ad3e02fbf8a5
author 17305 <guoxi.zhang@hand-china.com> 1540029427 +0800
committer 17305 <guoxi.zhang@hand-china.com> 1540029427 +0800
-
git cat-file -p 5313f2
结果
100644 blob dd6d6d6c4c00533b841fcbc2efc8e8ec98a855e8 welcome.txt
-
git cat-file -p eef995
结果
tree a114e050ce01e14905be557fc3ffc12991984e3e
parent 29fb68ec0cf0ff5c50e1bb4fa209468daf121b81
author 17305 <guoxi.zhang@hand-china.com> 1539960515 +0800
committer 17305 <guoxi.zhang@hand-china.com> 1539960515 +0800
配置文件中没有name的提交
-
git cat-file -p dd6d6d
结果
hello
nice to meet you
这些对象保存在Git库的objects目录下(ID的前2位作为目录名,后38位作为文件名)使用如下命令能看到这些对象在对象库中的位置
for id in 2443ae 5313f2 eef995 dd6d6d;
do
ls .git/objects/${id:0:2}/${id:2}*;
done
结果:
.git/objects/24/43ae29d86ec5edd6fbb70e2a01f1902dd02a37
.git/objects/53/13f2996a91501b2e79e4a93476132904e4082e
.git/objects/ee/f995dc79c6e5717942a19494a2ad3e02fbf8a5
.git/objects/dd/6d6d6c4c00533b841fcbc2efc8e8ec98a855e8
下图清晰地展示了Git对象库中各个对象的关系
对象之间的关系.png
下面是一个更接近于真实的版本库的结构图
Git版本库结构图
Git提供了很多方法可以方便的访问Git库中的对象
- 采用部分的SHA1哈希值。不必把40位写全,只采用开头的部分(4位及以上),只有不与现有哈希值冲突即可
- 使用HEAD代表版本库中最近的一次提交
- 符号^可以指代父提交。
HEAD^代表版本库中的上一次提交,即最近一次提交
的父提交
HEAD^^ 则代表HEAD^的父提交 - 对于一个提交有多个父提交,可以在符号^后面用数字表示是第几个父提交.
- 符号~<n>也可以用于指代祖先提交。例如
3534e4~5即相当于3534e4^^^^^ - 提交所对应的树对象。例如
3534e4^{tree} - 某一次提交所对应的文件对象
3534e4:path/to/file - 暂存区中的文件对象。
:/path/to/file
网友评论