Краткий ответ (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 отслеживает исходный код, используя четыре основных объекта:
- Аннотированные теги, указывающие на коммиты.
- Коммиты, которые указывают на корневое дерево каталогов вашего проекта.
- Деревья, то есть каталоги и подкаталоги.
- BLOB-объекты, представляющие собой файлы.
Каждый из этих объектов имеет свой собственный идентификатор хэша sha1, поскольку Линус Торвальдс разработал Git как файловую систему с адресацией по содержимому, то есть файлы могут быть извлечены на основе их содержимого (идентификаторы sha1 генерируются из содержимого файла). В книге Pro Git приведен пример диаграммы :

Коммит против дерева
Многие команды Git могут принимать специальные идентификаторы для коммитов и (под) деревьев каталогов:
"Commit-ish" - это идентификаторы, которые в конечном итоге приводят к объекту фиксации. Например,
tag -> commit
«Древовидный» - это идентификаторы, которые в конечном итоге приводят к объектам дерева (т. Е. Каталога).
tag -> commit -> project-root-directory
Поскольку объекты фиксации всегда указывают на объект дерева каталогов (корневой каталог вашего проекта), любой идентификатор, который является «фиктивным», по определению также является «древовидным». Другими словами, любой идентификатор, ведущий к объекту фиксации, также может использоваться для перехода к объекту (под) дерева каталогов .
Но поскольку объекты дерева каталогов никогда не указывают на фиксации в системе управления версиями Git, не каждый идентификатор, указывающий на (под) дерево каталогов, также может быть использован для указания фиксации. Другими словами, набор идентификаторов типа "фиксация" является строгим подмножеством набора идентификаторов типа "дерево".
Набор древовидных идентификаторов, которые нельзя использовать в качестве фиксации ,
<rev>:<path>, что ведет непосредственно к деревьям каталогов, а не к объектам фиксации. Например, HEAD:subdirectory.
Идентификаторы Sha1 объектов дерева каталогов .
stash@{0}. Я хотел бы знать, как это соотносится со всем этим. Есть ли еще что-нибудь вроде stash (my-thing@{0})? Это просто тайник<refname>?