В чем разница между деревом и типом коммита в Git? - PullRequest
4 голосов
/ 09 марта 2011

Я зарегистрировался одним файлом в простом git-репо. Из моих расследований; Есть три типа объектов, помещенных в .git/objects

  1. совершить
  2. дерево
  3. блоб

Как пример:

$ git cat-file -t 8b4e834eba22e60c284c7b77e43d3c29e619f92f
commit

$ git cat-file -t c7c5b03aea0b8c970c93de3670c28f2108948266
tree

$ git cat-file -t e965047ad7c57865823c7d992b1d046ea66edf78
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? Каковы их различия, если таковые имеются?

1 Ответ

9 голосов
/ 09 марта 2011

Объект коммита - это объект, который ссылается на дерево и связывает с ним другие метаданные (автор, коммиттер, метки времени и т. Д.).

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

Несколько объектов фиксации могут ссылаться на одно и то же дерево (если состояние файлов в каждом коммите идентично).

Например, если два человека внесут одно и то же изменение в файл и зафиксируют его, это приведет к двум разным объектам фиксации (поскольку метки времени и авторы будут различаться). Однако, поскольку конечным результатом является одинаковое содержимое файла, обе фиксации будут указывать на одно и то же дерево.

Когда вы запускаете git ls-tree в коммите SHA, он автоматически использует дерево SHA, на которое ссылается этот коммит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...