用git进出版本控制的时候,进行提交操作时,Git 会保存一个提交对象(commit object)。
每个提交对象都对应了git的每一次提交记录。
git 是用blob文件存储数据的,提交对象也是以blob文件存储的。
为了形象描述,先初始化一个git仓库:
# apple @ LTMac in ~ [14:25:16] C:127
$ mkdir gitTest
# apple @ LTMac in ~ [14:25:26]
$ cd gitTest && git init
Initialized empty Git repository in /Users/apple/gitTest/.git/
初始化完成后新增 a.txt 文件,并提交。
# apple @ LTMac in ~/gitTest on git:master o [14:26:40]
$ touch a.txt
# apple @ LTMac in ~/gitTest on git:master x [14:27:14]
$ git add a.txt
# apple @ LTMac in ~/gitTest on git:master x [14:27:18]
$ git commit -m 'init add a.txt'
[master (root-commit) f2db080] init add a.txt
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 a.txt
此时查看.git/object目录内容
# apple @ LTMac in ~/gitTest on git:master o [14:30:31]
$ cd .git/objects
# apple @ LTMac in ~/gitTest/.git/objects on git:master o [14:30:33]
$ tree
.
├── 65
│ └── a457425a679cbe9adf0d2741785d3ceabb44a7
├── e6
│ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
├── f2
│ └── db0800b86225354c511324d42fd6cb67890fb3
├── info
└── pack
5 directories, 3 files
可以看到.git/object 下多了三个目录。这里面其中一个文件就是commit object,
使用cat-file -t 查看每个blob文件的内容类型
# apple @ LTMac in ~/gitTest/.git/objects on git:master o [14:30:37]
$ git cat-file -t 65a4
tree
# apple @ LTMac in ~/gitTest/.git/objects on git:master o [14:33:25]
$ git cat-file -t e69d
blob
# apple @ LTMac in ~/gitTest/.git/objects on git:master o [14:33:39]
$ git cat-file -t f2db
commit
发现 f2db0800b86225354c511324d42fd6cb67890fb3 为commit object
使用cat-file -p命令查看f2db080 的content
# apple @ LTMac in ~/gitTest/.git/objects on git:master o [14:37:30] C:128
$ git cat-file -p f2db
tree 65a457425a679cbe9adf0d2741785d3ceabb44a7
author xxx <xxx@xxx.com> 1606717788 +0800
committer xxx <xxx@xxx.com> 1606717788 +0800
init add a.txt
回到上面的提交记录看,刚提交后的hash码是f2db080,正是这个commit object 文件名的前几位。
由于f2db080 是第一次提交,没有parent指针。
我们可以再提交一次内容:
# apple @ LTMac in ~/gitTest on git:master o [14:40:42]
$ touch b.txt
# apple @ LTMac in ~/gitTest on git:master x [14:41:18] C:127
$ git add . && git commit -m 'add b.txt'
[master befa19f] add b.txt
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 b.txt
然后再看看这次提交的comment object content
# apple @ LTMac in ~/gitTest on git:master o [14:41:34]
$ git cat-file -p befa19f
tree 2bdf04adb23d2b40b6085efb230856e5e2a775b7
parent f2db0800b86225354c511324d42fd6cb67890fb3
author litong <litongfe@foxmail.com> 1606718494 +0800
committer litong <litongfe@foxmail.com> 1606718494 +0800
add b.txt
从以上内容可见,提交对象包含了五部分内容
分别是:
tree, parent, author ,committer , mesage
如果是首次提交,commit object 中没有parent指针