Краткий ответ (TL; DR)
«Древовидность» - это термин, относящийся к любому идентификатору (как определено в документации редакций Git ), который в конечном итоге ведет к (под) дереву каталогов (Git называет каталоги «деревьями» и «объектами дерева»).
В случае исходного плаката foo
это каталог, который он хочет указать. Правильный способ указать (под) каталог в Git - использовать этот «древовидный» синтаксис (элемент № 15 из документации по редакциям Git ):
<rev>:<path>
, Например HEAD:README
, :README
,master:./README
Суффикс, :
за которым следует путь, называет большой двоичный объект или дерево по заданному пути в древовидном объекте, названном частью перед двоеточием.
Другими словами, master:foo
это правильный синтаксис, а не master/foo
.
Другой "древовидный" (плюс коммит-иш)
Вот полный список идентификаторов фиксации и дерева (из документации по версиям Git , спасибо LopSae за указание на это ):
----------------------------------------------------------------------
| 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, :README, master:./README
----------------------------------------------------------------------
| Tree-ish? | Examples
----------------------------------------------------------------------
| 16. :<n>:<path> | :0:README, :README
----------------------------------------------------------------------
Идентификаторы №1–14 являются «фиктивными», потому что все они приводят к фиксации, но поскольку фиксации также указывают на деревья каталогов, все они в конечном итоге приводят к (под) объектам дерева каталогов и, следовательно, могут также использоваться как «дерево» -ish».
# 15 также может использоваться как древовидный, когда он относится к (под) каталогу, но его также можно использовать для идентификации определенных файлов. Когда он обращается к файлам, я не уверен, считается ли он по-прежнему «древовидным» или действует скорее как «блоб-иш» (Git называет файлы «блобами»).
Длинный ответ
На самом низком уровне Git отслеживает исходный код, используя четыре основных объекта:
- Аннотированные теги, указывающие на коммиты.
- Коммиты, которые указывают на корневое дерево каталогов вашего проекта.
- Деревья, то есть каталоги и подкаталоги.
- BLOB-объекты, представляющие собой файлы.
Каждый из этих объектов имеет свой собственный идентификатор хэша sha1, поскольку Линус Торвальдс разработал Git как файловую систему с адресацией по содержимому, то есть файлы могут быть извлечены на основе их содержимого (идентификаторы sha1 генерируются из содержимого файла). В книге Pro Git приведен пример диаграммы :
Многие команды Git могут принимать специальные идентификаторы для коммитов и (под) деревьев каталогов:
"Commit-ish" - это идентификаторы, которые в конечном итоге приводят к объекту фиксации. Например,
tag -> commit
«Древовидный» - это идентификаторы, которые в конечном итоге приводят к объектам дерева (т. Е. Каталога).
tag -> commit -> project-root-directory
Поскольку объекты фиксации всегда указывают на объект дерева каталогов (корневой каталог вашего проекта), любой идентификатор, который является «фиктивным», по определению также является «древовидным». Другими словами, любой идентификатор, ведущий к объекту фиксации, также может использоваться для перехода к объекту (под) дерева каталогов .
Но поскольку объекты дерева каталогов никогда не указывают на фиксации в системе управления версиями Git, не каждый идентификатор, указывающий на (под) дерево каталогов, также может быть использован для указания фиксации. Другими словами, набор идентификаторов типа "фиксация" является строгим подмножеством набора идентификаторов типа "дерево".
Как объясняется в документации ( спасибо Требору за помощь в его поиске ):
<tree>
Указывает имя объекта дерева.
<commit>
Указывает имя объекта фиксации.
<tree-ish>
Указывает имя объекта дерева, фиксации или тега. Команда, которая принимает <tree-ish>
аргумент, в конечном итоге хочет работать с <tree>
объектом, но автоматически разыменовывает <commit>
и <tag>
объекты, которые указывают на <tree>
.
<commit-ish>
Указывает имя объекта фиксации или тега. Команда, которая принимает <commit-ish>
аргумент, в конечном итоге хочет работать с <commit>
объектом, но автоматически разыменовывает <tag>
объекты, которые указывают на <commit>
.
Набор древовидных идентификаторов, которые нельзя использовать в качестве фиксации ,
<rev>:<path>
, что ведет непосредственно к деревьям каталогов, а не к объектам фиксации. Например, HEAD:subdirectory
.
Идентификаторы Sha1 объектов дерева каталогов .
master:foo
древовидный, но лучше использоватьmaster foo
как i<tree-ish> <path>
.