Git中的树和提交类型有什么区别?

12

我在一个简单的Git仓库中上传了一个文件。

根据我的调查,.git/objects目录下有三种类型的对象:

  1. commit(提交)
  2. tree(树)
  3. blob(文件)

以下是一个示例:

$ git cat-file -t 8b4e834eba22e60c284c7b77e43d3c29e619f92f
commit

$ git cat-file -t c7c5b03aea0b8c970c93de3670c28f2108948266
tree

$ git cat-file -t e965047ad7c57865823c7d992b1d046ea66edf78
blob

如果我试图在blob上运行git-ls-tree,则会引发错误。

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

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

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

一个commit对象也是一个tree吗?它们之间有什么区别吗?
1个回答

19

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

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

多个提交对象可以引用相同的树(如果每个提交中文件的状态相同)。

例如,如果两个人对文件进行相同的更改并提交,将导致两个不同的提交对象(因为时间戳和作者都不同)。然而,由于最终的结果是相同的文件内容,因此两个提交都指向相同的树。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接