2011-03-09 23 views
4

我在一个文件中检入了一个简单的git仓库。 从我的调查;有放置在.git/objectsGit中的树和提交类型有什么区别?

  1. 三种类型的对象提交
  2. BLOB

举个例子:

$ git cat-file -t 8b4e834eba22e60c284c7b77e43d3c29e619f92f 
commit 

$ git cat-file -t c7c5b03aea0b8c970c93de3670c28f2108948266 
tree 

$ git cat-file -t e965047ad7c57865823c7d992b1d046ea66edf78 
blob 

如果我试图运行git-LS-树上一个blob,它会抛出一个错误。

但我同样可以在committree对象上运行它。

$ git ls-tree -t c7c5b03aea0b8c970c93de3670c28f2108948266 
100644 blob e965047ad7c57865823c7d992b1d046ea66edf78 readme.txt 

$ git ls-tree -t 8b4e834eba22e60c284c7b77e43d3c29e619f92f 
100644 blob e965047ad7c57865823c7d992b1d046ea66edf78 readme.txt 

是一个commit对象也tree? 他们的区别是什么?

回答

9

提交对象是一个引用树的对象,并将其他元数据(作者,提交者,时间戳等)与它相关联。

  Commit 
    /  \ 
    /  \ 
(parent SHA)  Tree 
(author)  / \ 
(committer) Blob Blob 
(timestamps) 
(etc) 

多个对象提交可以引用相同的树(如果文件中的每个的状态提交是相同的)。例如,如果两个人对一个文件进行相同的更改并提交,它将导致两个不同的提交对象(因为时间戳和作者都会有所不同)。但是,由于最终结果是相同的文件内容,因此两个提交都将指向同一棵树。

当您在提交SHA上运行git ls-tree时,它会自动使用该提交所引用的树SHA。

相关问题