Que sont commit-ish et tree-ish dans Git?

117

La question

Quels sont des exemples spécifiques de commit-ish et tree-ish dans Git?

La question de Stack Overflow "Que signifie tree-ish dans git?" traite spécifiquement de l'arborescence, mais je veux en savoir plus sur les deux .

Contexte

Utilisations dans la documentation

La documentation Git fait plusieurs références à "commit-ish" et "tree-ish". Par exemple, si vous examinez le code source 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

et

$ 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

Définitions

La documentation Git définit ce que sont "commit-ish" et "tree-ish" :

<tree>

Indique un nom d'objet d'arborescence.

<commit>

Indique un nom d'objet de validation.

<tree-ish>

Indique un nom d'objet arborescent, commit ou tag. Une commande qui prend un <tree-ish> argument veut finalement opérer sur un <tree>objet mais déréférence automatiquement <commit>et les <tag>objets qui pointent vers un <tree>.

<commit-ish>

Indique un nom d'objet de validation ou de balise. Une commande qui prend un <commit-ish> argument veut finalement opérer sur un <commit>objet mais déréférence automatiquement les <tag>objets qui pointent vers un <commit>.

La documentation n'est pas assez claire

Même si la documentation ci-dessus définit ce que sont «commit-ish» et «tree-ish», je trouve toujours que c'est trop vague et peu clair.

Quels sont des exemples spécifiques de "commit-ish" et "tree-ish", et en quoi sont-ils différents les uns des autres?

Communauté
la source

Réponses:

156

La réponse courte (TL; DR)

Voici une liste complète des identifiants commit-ish et tree-ish (à partir de la documentation des révisions 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
----------------------------------------------------------------------

Les identificateurs # 1-14 sont tous "commit-ish", car ils mènent tous à des commits, mais comme les commits pointent également vers des arborescences de répertoires, ils mènent tous finalement à des objets d'arborescence de (sous) répertoires, et peuvent donc également être utilisés comme "arborescence" -ish ".

# 15 peut également être utilisé comme arborescence lorsqu'il fait référence à un (sous) répertoire, mais il peut également être utilisé pour identifier des fichiers spécifiques. Quand il fait référence à des fichiers, je ne sais pas s'il est toujours considéré comme "tree-ish", ou s'il agit plus comme "blob-ish" (Git fait référence aux fichiers comme "blobs").

La longue réponse

Commits et arborescences de répertoires dans Git

À ses niveaux les plus bas, Git assure le suivi du code source à l'aide de quatre objets fondamentaux:

  1. Balises annotées, qui pointent vers des commits.
  2. Commits, qui pointent vers l'arborescence de répertoires racine de votre projet.
  3. Les arbres, qui sont des répertoires et des sous-répertoires.
  4. Blobs, qui sont des fichiers.

Chacun de ces objets a son propre ID de hachage sha1, puisque Linus Torvalds a conçu Git comme un système de fichiers adressable par le contenu , c'est-à-dire que les fichiers peuvent être récupérés en fonction de leur contenu (les ID sha1 sont générés à partir du contenu du fichier). Le livre Pro Git donne cet exemple de diagramme :

Figure 9-3 du livre Pro Git

Commit-ish vs Tree-ish

De nombreuses commandes Git peuvent accepter des identificateurs spéciaux pour les commits et les arborescences de (sous) répertoires:

  • "Commit-ish" sont des identificateurs qui mènent finalement à un objet de commit. Par exemple,

    tag -> commit

  • "Tree-ish" sont des identifiants qui mènent finalement à des objets d'arborescence (ie répertoire).

    tag -> commit -> project-root-directory

Étant donné que les objets de validation pointent toujours vers un objet d'arborescence de répertoires (le répertoire racine de votre projet), tout identificateur qui est "commit-ish" est, par définition, également "tree-ish". En d'autres termes, tout identifiant menant à un objet de validation peut également être utilisé pour conduire à un objet d'arborescence de (sous) répertoires .

Mais comme les objets de l'arborescence de répertoires ne pointent jamais vers des commits dans le système de gestion des versions de Git, tous les identificateurs qui pointent vers une (sous) arborescence de répertoires ne peuvent pas également être utilisés pour pointer vers un commit. En d'autres termes, l'ensemble des identifiants "commit-ish" est un sous-ensemble strict de l'ensemble des identifiants "tree-ish".

L'ensemble des identificateurs d'arborescence qui ne peuvent pas être utilisés comme commit-ish sont

  1. <rev>:<path>, qui mène directement aux arborescences de répertoires, pas aux objets de validation. Par exemple HEAD:subdirectory,.

  2. Identificateurs Sha1 des objets de l' arborescence de répertoires .


la source
3
N'oubliez pas stash@{0}. J'aimerais savoir où cela s'inscrit dans tout cela. Y a-t-il d'autres choses comme la cachette ( my-thing@{0})? La cachette est-elle juste un <refname>?
Nate
Il n'a pas été précisé explicitement qu'un identifiant arborescent semble être un identifiant plus spécifique qu'un identifiant commit-ish. Peut-être que je suis bizarre mais c'est la seule façon raisonnable de l'expliquer IMO
Steven Lu
29

Remarque pour les anglophones [sic!] Non natifs: "-ish" est un suffixe qui peut être appliqué à un adjectif pour indiquer "ayant des qualités comme" ou "légèrement" - voir http://chambers.co.uk / search /? query = ish & title = 21e

D'où "tree-ish" - comme un "tree" .... "commit-ish" - comme un "commit"

par exemple "Mars apparaît comme une étoile rougeâtre" ("d" est doublé!); "la nourriture dans l'assiette n'était pas chaude, mais tiède"

Je pense que cela aide à expliquer "ce qui est ..." mieux, en ce sens que cela explique l'utilisation du langage.

MikeW
la source
J'ai toujours interprété «tree-ish» et «commit-ish» comme étant analogues à dire «suédois» ou «anglais». L'usage que vous décrivez a moins de sens pour moi parce que cette forme de «ish» crée un adjectif. Mais le tour est pas « comme » un arbre ou commettre, il est un arbre ou commettre. D'un autre côté, si vous pensez à "ish" comme un suffixe de langage, ils ont plus de sens en tant que noms sur la ligne de commande, où "tree-ish" est la langue qui forme le nom. Je ne sais pas quelle interprétation était l'intention des auteurs, mais c'est comme ça que je l'ai toujours vue.
jmt le
Je comprends votre point de vue, mais je ne faisais que donner l'impression que j'ai, en tant que langue maternelle anglaise!
MikeW