Ответ 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 книга дает эту диаграмму примера:
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 объектов дерева каталогов.