Что такое commit-ish и tree-ish в Git?

Вопрос

Каковы конкретные примеры commit-ish и tree-ish в Git?

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

Фон

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

Документация Git содержит несколько ссылок на "commit-ish" и "Дерево-иш". Например, если вы изучите исходный код 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 определяет, что "commit-ish" и "tree-ish" ::

<tree>

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

<commit>

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

<tree-ish>

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

<commit-ish>

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

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

Несмотря на то, что в приведенной выше документации определяется, что такое "commit-ish" и "tree-ish", Я все еще считаю, что это слишком расплывчато и неясно.

Каковы конкретные примеры "commit-ish" и "tree-ish" и как они отличаются друг от друга?

Ответ 1

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

Здесь приведен полный список идентификаторов commit-ish и tree-ish (из Git редакция документации):

----------------------------------------------------------------------
|    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>}    | [email protected]{yesterday}, [email protected]{5 minutes ago}
|  5. <refname>@{<n>}       | [email protected]{1}
|  6. @{<n>}                | @{1}
|  7. @{-<n>}               | @{-1}
|  8. <refname>@{upstream}  | [email protected]{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 - все "commit-ish" , потому что все они приводят к фиксации, но потому что коммиты также указывают на деревья каталогов, все они в конечном итоге приводят к (sub), и поэтому их также можно использовать как "tree-ish".

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

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

Записи и деревья каталогов в Git

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

  • Аннотированные теги, которые указывают на фиксацию.
  • Задает, указывая на корневое дерево каталогов вашего проекта.
  • Деревья, которые являются каталогами и подкаталогами.
  • Blobs, которые являются файлами.

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

Figure 9-3 from Pro Git book

Commit-ish vs Tree-ish

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

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

    tag -> commit

  • "Tree-ish" - это идентификаторы, которые в конечном итоге приводят к созданию объектов дерева (например, каталога).

    tag -> commit -> project-root-directory

Поскольку объекты фиксации всегда указывают на объект дерева каталогов (корень каталог вашего проекта), любой идентификатор, который является "commit-ish" , является определение, также "tree-ish". Другими словами, любой идентификатор, который приводит к объект commit также может использоваться для создания объекта дерева подкаталогов.

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

Набор идентификаторов дерева, которые не может использоваться как commit-ish,

  • <rev>:<path>, который приводит непосредственно к деревьям каталогов, а не commit объекты. Например, HEAD:subdirectory.

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

Ответ 2

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

Следовательно, "tree-ish" - как "дерево".... "commit-ish" - как "commit"

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

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