我在一个文件中检入了一个简单的git仓库。
从我的调查;在.git/objects
举个例子:
$ git cat-file -t 8b4e834eba22e60c284c7b77e43d3c29e619f92f
commit
$ git cat-file -t c7c5b03aea0b8c970c93de3670c28f2108948266
tree
$ git cat-file -t e965047ad7c57865823c7d992b1d046ea66edf78
blob
如果我尝试在blob上运行git-ls-tree,则会抛出错误。
但我同样可以在commit
或tree
对象上运行它。
$ git ls-tree -t c7c5b03aea0b8c970c93de3670c28f2108948266
100644 blob e965047ad7c57865823c7d992b1d046ea66edf78 readme.txt
$ git ls-tree -t 8b4e834eba22e60c284c7b77e43d3c29e619f92f
100644 blob e965047ad7c57865823c7d992b1d046ea66edf78 readme.txt
commit
对象也是tree
吗?
如果有的话,他们有什么不同?
答案 0 :(得分:9)
提交对象是一个引用树并将其他元数据(作者,提交者,时间戳等)与其关联的对象。
Commit
/ \
/ \
(parent SHA) Tree
(author) / \
(committer) Blob Blob
(timestamps)
(etc)
多个提交对象可以引用同一个树(如果每个提交中的文件状态相同)。
例如,如果两个人对文件和提交进行相同的更改,则会产生两个不同的提交对象(因为时间戳和作者都会有所不同)。但是,由于最终结果是相同的文件内容,因此两个提交都将指向同一个树。
在提交SHA上运行git ls-tree
时,它会自动使用该提交引用的树SHA。