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

时间:2011-03-09 07:54:50

标签: git

我在一个文件中检入了一个简单的git仓库。 从我的调查;在.git/objects

中放置了三种类型的对象
  1. 提交
  2. 团块
  3. 举个例子:

    $ 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 个答案:

答案 0 :(得分:9)

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

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

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

例如,如果两个人对文件和提交进行相同的更改,则会产生两个不同的提交对象(因为时间戳和作者都会有所不同)。但是,由于最终结果是相同的文件内容,因此两个提交都将指向同一个树。

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