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

Fra*_*ery 5 git

我在一个文件中签入了一个简单的git仓库.从我的调查; 放置了三种类型的对象.git/objects

  1. 承诺
  2. BLOB

举个例子:

$ git cat-file -t 8b4e834eba22e60c284c7b77e43d3c29e619f92f
commit

$ git cat-file -t c7c5b03aea0b8c970c93de3670c28f2108948266
tree

$ git cat-file -t e965047ad7c57865823c7d992b1d046ea66edf78
blob
Run Code Online (Sandbox Code Playgroud)

如果我试图在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
Run Code Online (Sandbox Code Playgroud)

是一个commit对象也tree?它们有什么不同,如果有的话?

Amb*_*ber 11

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

         Commit
       /        \
      /          \
(parent SHA)     Tree
(author)        /    \
(committer)   Blob   Blob
(timestamps)
(etc)
Run Code Online (Sandbox Code Playgroud)

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

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

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