Що таке коміт-іш та дерева-іш в Git?


117

Питання

Назвіть конкретні приклади фіш-іш та дерева-іш в Git?

Питання переповнення стека "Що означає дерево-ish в git?" конкретно стосується дерева-ish, але я хочу зрозуміти більше про обидва .

Фон

Використання в документації

Документація 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>об'єкти, які вказують на a <tree>.

<commit-ish>

Вказує ім'я об'єкта чи тегу. Команда, яка приймає <commit-ish> аргумент, в кінцевому підсумку хоче оперувати <commit>об’єктом, але автоматично відмежувати <tag>об'єкти, які вказують на a <commit>.

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

Незважаючи на те, що вищенаведена документація визначає, що таке "виконувати іш" та "дерево-іш", я все ще вважаю це занадто розпливчастим і незрозумілим.

Назвіть конкретні приклади "фікш-іш" та "дерев-іш", і чим вони відрізняються один від одного?

Відповіді:


156

Короткий відповідь (TL; DR)

Ось повний перелік ідентифікаторів виконувати і виконувати дерева (з документації на редагування 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>}    | 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 також може використовуватися як дерево-ish, коли він посилається на (під) каталог, але він також може бути використаний для ідентифікації конкретних файлів. Коли він посилається на файли, я не впевнений, чи він все ще вважається "деревом-іш", чи чи діє більше як "blob-ish" (Git посилається на файли як "blobs").

Довга відповідь

Збирає та каталогізує дерева в Git

На найнижчих рівнях Git відстежує вихідний код за допомогою чотирьох основних об'єктів:

  1. Помічені теги, які вказують на коміти.
  2. Коміти, які вказують на дерево кореневих каталогів вашого проекту.
  3. Дерева - це каталоги та підкаталоги.
  4. Краплі, які є файлами.

Кожен з цих об'єктів має свій ідентифікатор sha1 хеша, оскільки Лінус Торвальдс розробив Git як файлову систему, адресовану вмістом, тобто файли можна отримати на основі їх вмісту (ша1 ідентифікатори генеруються з вмісту файлу). У книзі Pro Git наведено такий приклад діаграми :

Малюнок 9-3 із книги Pro Git

Коміш-іш проти Дерево-іш

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

  • "Здійснення результатів" - це ідентифікатори, які в кінцевому підсумку призводять до об'єкта "фіксація". Наприклад,

    tag -> commit

  • "Дерево-іш" - це ідентифікатори, які в кінцевому підсумку призводять до деревних (тобто директорійних) об'єктів.

    tag -> commit -> project-root-directory

Оскільки об'єкти фіксації завжди вказують на об'єкт дерева каталогів (кореневий каталог вашого проекту), будь-який ідентифікатор, який є "виконувати-іш", за визначенням також є "деревом-іш". Іншими словами, будь-який ідентифікатор, який призводить до об’єкта фіксації, також може бути використаний для ведення до (під) дерева об'єкта каталогу .

Але оскільки об'єкти дерева каталогів ніколи не вказують на коміти в системі версій Git, не кожен ідентифікатор, який вказує на (під) дерево каталогів, також може використовуватися для вказівки на фіксацію. Іншими словами, набір ідентифікаторів "виконувати іш" є суворим підмножиною набору ідентифікаторів "дерево-іш".

Набір ідентифікаторів дерева-ish, які не можуть бути використані як виконувати результати, є

  1. <rev>:<path>, що веде безпосередньо до дерев каталогів, а не здійснює об'єкти. Наприклад, HEAD:subdirectory.

  2. Ідентифікатори Sha1 об'єктів дерева каталогів .


3
Не забувай про це stash@{0}. Я хотів би знати, де це вписується у все це. Чи є якісь інші речі, як скринька ( my-thing@{0})? Це приховування просто <refname>?
Нейт

Не було чітко прояснено, що ідентифікатор дерева-ish здається більш конкретним ідентифікатором, ніж ідентифікатор "виконувати". Можливо, я дивний, але це єдиний розумний спосіб пояснити це ІМО
Стівен Лу

29

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

Отже, "дерево-іш" - як "дерево" .... "вчинити-іш" - як "вчинити"

наприклад, "Марс виглядає як червонувата зірка" ("d" подвоюється!); "їжа на тарілці була не гарячою, але теплою"

Я вважаю, що це допомагає пояснити "що таке ..." краще, оскільки це пояснює використання мови.


Я завжди трактував "дерево-іш" і "виконувати-іш" аналогічно вимові "шведська" або "англійська". Вживання, яке ви описуєте, має менший сенс для мене, оскільки така форма "ish" створює прикметник. Але оборот не «як» дерево або зробити, то це дерево або зробити. З іншого боку, якщо ви вважаєте "ish" як суфікс мови, то вони мають більше сенсу як іменники в командному рядку, де "tree-ish" - це мова, що утворює іменник. Я не знаю, яка інтерпретація була задумом авторів, але саме так я завжди бачив.
jmt

Я бачу вашу думку, але я просто створював враження, яке я маю як носій англійської мови!
MikeW
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.