Что такое коммит и древовидность в Git?

118

Вопрос

Каковы конкретные примеры коммитов и древовидности в Git?

Вопрос о переполнении стека "Что означает древовидность в git?" имеет дело с древовидной структурой, но я хочу больше узнать об обоих .

Задний план

Использование в документации

В документации Git есть несколько ссылок на "фиктивный" и "древовидный". Например, если вы изучаете исходный код Git :

$ git grep --files-with-matches --extended-regexp "commit(-)*ish"
config.txt
git-describe.txt
git-fast-import.txt
git-name-rev.txt
git-push.txt
git-rebase.txt
git-rev-parse.txt
git.txt
gitcli.txt
glossary-content.txt
howto/revert-branch-rebase.txt
revisions.txt

и

$ git grep --files-with-matches --extended-regexp "tree(-)*ish" | \
$ grep --invert-match RelNotes
diff-format.txt
diff-generate-patch.txt
git-archive.txt
git-cat-file.txt
git-checkout.txt
git-diff-index.txt
git-diff-tree.txt
git-ls-files.txt
git-ls-tree.txt
git-merge-tree.txt
git-read-tree.txt
git-reset.txt
git-svn.txt
git.txt
gitcli.txt
gittutorial-2.txt
glossary-content.txt
revisions.txt

Определения

Документация Git определяет, что такое «фиктивный» и «древовидный» :

<tree>

Указывает имя объекта дерева.

<commit>

Указывает имя объекта фиксации.

<tree-ish>

Указывает имя объекта дерева, фиксации или тега. Команда, которая принимает <tree-ish> аргумент, в конечном итоге хочет работать с <tree>объектом, но автоматически разыменовывает <commit>и <tag>объекты, которые указывают на <tree>.

<commit-ish>

Указывает имя объекта фиксации или тега. Команда, которая принимает <commit-ish> аргумент, в конечном итоге хочет работать с <commit>объектом, но автоматически разыменовывает <tag>объекты, которые указывают на <commit>.

Документация недостаточно ясна

Несмотря на то, что приведенная выше документация определяет, что такое «фиктивный» и «древовидный», я все же считаю его слишком расплывчатым и неясным.

Каковы конкретные примеры «коммитов» и «древовидных» и чем они отличаются друг от друга?

Сообщество
источник

Ответы:

157

Краткий ответ (TL; DR)

Вот полный список идентификаторов фиксации и дерева (из документации Git revisions ):

----------------------------------------------------------------------
|    Commit-ish/Tree-ish    |                Examples
----------------------------------------------------------------------
|  1. <sha1>                | dae86e1950b1277e545cee180551750029cfe735
|  2. <describeOutput>      | v1.7.4.2-679-g3bee7fb
|  3. <refname>             | master, heads/master, refs/heads/master
|  4. <refname>@{<date>}    | master@{yesterday}, HEAD@{5 minutes ago}
|  5. <refname>@{<n>}       | master@{1}
|  6. @{<n>}                | @{1}
|  7. @{-<n>}               | @{-1}
|  8. <refname>@{upstream}  | master@{upstream}, @{u}
|  9. <rev>^                | HEAD^, v1.5.1^0
| 10. <rev>~<n>             | master~3
| 11. <rev>^{<type>}        | v0.99.8^{commit}
| 12. <rev>^{}              | v0.99.8^{}
| 13. <rev>^{/<text>}       | HEAD^{/fix nasty bug}
| 14. :/<text>              | :/fix nasty bug
----------------------------------------------------------------------
|       Tree-ish only       |                Examples
----------------------------------------------------------------------
| 15. <rev>:<path>          | HEAD:README.txt, master:sub-directory/
----------------------------------------------------------------------
|         Tree-ish?         |                Examples
----------------------------------------------------------------------
| 16. :<n>:<path>           | :0:README, :README
----------------------------------------------------------------------

Идентификаторы №1–14 являются «фиктивными», потому что все они приводят к фиксации, но поскольку фиксации также указывают на деревья каталогов, все они в конечном итоге приводят к (под) объектам дерева каталогов и, следовательно, могут также использоваться как «дерево» -иш ".

# 15 также может использоваться как древовидный, когда он относится к (под) каталогу, но его также можно использовать для идентификации определенных файлов. Когда он обращается к файлам, я не уверен, считается ли он по-прежнему «древовидным» или действует скорее как «блоб-иш» (Git называет файлы «блобами»).

Длинный ответ

Коммиты и деревья каталогов в Git

На самом низком уровне Git отслеживает исходный код, используя четыре основных объекта:

  1. Аннотированные теги, указывающие на коммиты.
  2. Коммиты, которые указывают на корневое дерево каталогов вашего проекта.
  3. Деревья, то есть каталоги и подкаталоги.
  4. BLOB-объекты, представляющие собой файлы.

Каждый из этих объектов имеет свой собственный идентификатор хэша sha1, поскольку Линус Торвальдс разработал Git как файловую систему с адресацией по содержимому, то есть файлы могут быть извлечены на основе их содержимого (идентификаторы sha1 генерируются из содержимого файла). В книге Pro Git приведен пример диаграммы :

Рисунок 9-3 из книги Pro Git

Коммит против дерева

Многие команды Git могут принимать специальные идентификаторы для коммитов и (под) деревьев каталогов:

  • "Commit-ish" - это идентификаторы, которые в конечном итоге приводят к объекту фиксации. Например,

    tag -> commit

  • «Древовидный» - это идентификаторы, которые в конечном итоге приводят к объектам дерева (т. Е. Каталога).

    tag -> commit -> project-root-directory

Поскольку объекты фиксации всегда указывают на объект дерева каталогов (корневой каталог вашего проекта), любой идентификатор, который является «фиктивным», по определению также является «древовидным». Другими словами, любой идентификатор, ведущий к объекту фиксации, также может использоваться для перехода к объекту (под) дерева каталогов .

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

Набор древовидных идентификаторов, которые нельзя использовать в качестве фиксации ,

  1. <rev>:<path>, что ведет непосредственно к деревьям каталогов, а не к объектам фиксации. Например, HEAD:subdirectory.

  2. Идентификаторы Sha1 объектов дерева каталогов .


источник
3
Не забывай об этом stash@{0}. Я хотел бы знать, как это соотносится со всем этим. Есть ли еще что-нибудь вроде stash ( my-thing@{0})? Это просто тайник <refname>?
Нейт
Не было явно указано, что древовидный идентификатор кажется более конкретным идентификатором, чем идентификатор фиксации. Может я и странный, но это единственный разумный способ объяснить это ИМО
Стивен Лу
30

Примечание для носителей английского языка [sic!], Для которых английский язык не является родным: «-ish» - это суффикс, который можно применять к прилагательному, чтобы указать «обладающий такими качествами, как» или «слегка» - см. Http://chambers.co.uk / search /? query = ish & title = 21st

Следовательно, «древовидный» - как «дерево» .... «коммит-иш» - как «коммит»

например, «Марс выглядит как красноватая звезда» («d» удвоено!); "еда на тарелке была не горячей, а теплой"

Я считаю, что это помогает лучше объяснить «что такое ...», поскольку это объясняет использование языка.

MikeW
источник
Я всегда интерпретировал «древовидный» и «фиктивный» как аналог слов «шведский» или «английский». Использование, которое вы описываете, имеет для меня меньше смысла, потому что эта форма слова «ish» создает прилагательное. Но оборот не «как» дерево или совершить, то это дерево или совершить. С другой стороны, если вы думаете о «ish» как о языковом суффиксе, тогда они будут иметь больше смысла как существительные в командной строке, где «tree-ish» - это язык, на котором образуется существительное. Я не знаю, какая интерпретация была задумана авторами, но я всегда так видел.
jmt
Я понимаю вашу точку зрения, но я просто произвел впечатление, что у меня есть как носитель английского языка!
MikeW