¿Cuál es la diferencia entre un tree y tipo de compromiso en Git?

Revisé un file en un simple repository git. De mis investigaciones; hay tres types de objects colocados en .git/objects

  1. cometer
  2. tree
  3. gota

Como ejemplo:

 $ git cat-file -t 8b4e834eba22e60c284c7b77e43d3c29e619f92f commit $ git cat-file -t c7c5b03aea0b8c970c93de3670c28f2108948266 tree $ git cat-file -t e965047ad7c57865823c7d992b1d046ea66edf78 blob 

Si traté de ejecutar git-ls-tree en un blob, arroja un error.

Pero también es posible para mí ejecutarlo en un object commit o tree .

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

¿Es un object de commit también un tree ? ¿Cuáles son sus diferencias, si las hay?

Un object commit es un object que hace reference a un tree y asocia otros metadatos (autor, committer, timestamps, etc.) con él.

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

Varios objects de confirmación pueden hacer reference al mismo tree (si el estado de los files en cada confirmación es idéntico).

Por ejemplo, si dos personas hacen el mismo cambio en un file y se comprometen, dará como resultado dos objects de confirmación diferentes (ya que tanto las marcas de time como los autores serán diferentes). Sin embargo, dado que el resultado final es el mismo contenido de file, ambos commits apuntarán al mismo tree.

Cuando ejecuta git ls-tree en un SHA de confirmación, automáticamente utiliza el tree SHA al que hace reference esa confirmación.