Git每提交一次,就会在objects文件夹中增加3个目录,一个存放commit对象、一个存放tree对象、一个存放blob对象
例如:若提交记录是下面这个样子
$ git log commit 44374b0fe093277e2c6326925bfd5e7db809cdcb Author: xinlei.zhu <xinlei.zhu@qunar.com> Date: Mon Nov 3 12:11:30 2014 +0800 second commit 3153c466b8513688d0782822126bbf3bc01b5ebc Author: xinlei.zhu <xinlei.zhu@qunar.com> Date: Mon Nov 3 12:02:08 2014 +0800 first |
说明有两个commit记录,SHA1值分别为:44374b0fe093277e2c6326925bfd5e7db809cdcb(第二次提交)、3153c466b8513688d0782822126bbf3bc01b5ebc(第一次提交)
对于每次提交会产生3个文件夹,其中代表commit对象的文件夹的名字为:44 和 31 (用commit对象的SHA1值得前两个字符作为文件夹的名字)
在commit文件夹下各有一个文件,文件名为commit对象SHA1值的后38个字符,对于上述提交则有:/44/374b0fe093277e2c6326925bfd5e7db809cdcb 和 /31/53c466b8513688d0782822126bbf3bc01b5ebc
commit文件夹中的文件内容包含:tree对象的SHA1值、panrent的SHA1值(如果不为第一次提交的话)、author和committer的信息
如下所示:
$ git cat-file -p 44374b0fe093277e2c6326925bfd5e7db809cdcb tree 82d9e2c256f6d6ce01d4da075ad60b8e1ff2d241 parent 3153c466b8513688d0782822126bbf3bc01b5ebc author xinlei.zhu <xinlei.zhu@qunar.com> 1414987890 +0800 committer xinlei.zhu <xinlei.zhu@qunar.com> 1414987890 +0800 second |
上面的加粗内容为commit对象所包含的内容:tree对象、parent对象(该对象指向上一个commit对象)、author、committer
前面说过一次提交会产生3个文件夹,commit文件夹、tree文件夹、blob文件夹,commit文件夹我们已经知道了,这里说说tree文件夹
tree文件夹保存的时tree对象,该文件夹的名字也是其对象的SHA1值得前两个字符,这里为:82
tree文件夹下有一个文件代表tree对象,名字为tree对象SHA1值得后38位字符,即:/82/d9e2c256f6d6ce01d4da075ad60b8e1ff2d241
然后我们查看tree对象:
$ git cat-file -p 82d9e2c256f6d6ce01d4da075ad60b8e1ff2d241 100644 blob d800886d9c86731ae5c4a62b0b77c437015e00d2 1.txt 100644 blob ee2b8364542e6512c6ff1d906cfa3787731f3ec2 2.txt |
发现里面包含两个blob文件,分别为1.txt 、2.txt,这两个文件正是我所提交的内容(第一次提交了1.txt, 第二次提交了1.txt和2.txt),这里查看的也是第二次提交的tree对象
如果再查看2.txt的话:
$ git cat-file -p ee2b8364542e6512c6ff1d906cfa3787731f3ec2 456 |
会发现它的值正是2.txt文件里的内容。
总结:我们提交的文件最终都是存放在git工作目录下的,以SHA1值为文件名,每个blob对象存放一个文件