web-dev-qa-db-fra.com

Qu'est-ce qu'une expression de révision Git?

J'utilise donc l'interface graphique de Git pour créer un référentiel. Mais je ne trouve AUCUNE trace sur Google, dans la documentation ou ailleurs, sur ce qu'est une "expression de révision" et il est nécessaire de créer une nouvelle branche.

En outre, il semble que cela soit utilisé à de nombreux autres endroits dans le programme, alors je pense qu'il est important de le savoir.

J'ai trouvé une question à ce sujet sur StackOverflow, mais le gars n'a jamais eu de réponse.

J'ai juste besoin de savoir: Qu'est-ce qu'une expression de révision?

32
Tyler Carter

git doit pouvoir identifier un commit pendant plusieurs opérations courantes

Il y a plusieurs façons d'identifier un commit. Vous pouvez utiliser une branche, une balise, une validation sha1 ou des expressions. Par exemple:

git log HEAD

HEAD résout finalement en un commit spécifique, et vous recevrez le journal pour cela. Vous pourriez aussi dire:

git log master

master est une branche, et cela résoudra également en un commit spécifique.

git log fd72e9c99312

Maintenant que IS le commit réel.


La documentation ci-dessous correspond à ce que vous recherchez. Extrait de la documentation de la commande git-rev-parse à http://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html .

SPÉCIFICATION DES RÉVISIONS

Un paramètre de révision nomme généralement, mais pas nécessairement, un objet de validation. Ils utilisent ce qu'on appelle une syntaxe SHA1 étendue. Voici différentes manières d'épeler les noms d'objet. Ceux énumérés à la fin de cette liste doivent nommer les arbres et les blobs contenus dans un commit.

Nom d'objet SHA1 complet (chaîne hexadécimale de 40 octets) ou sous-chaîne unique dans le référentiel. Par exemple. dae86e1950b1277e545cee180551750029cfe735 et dae86e désignent tous deux le même objet de validation s'il n'y a pas d'autre objet dans votre référentiel dont le nom d'objet commence par dae86e.

Une sortie de git-describe; c'est-à-dire une balise la plus proche, éventuellement suivie d'un tiret et d'un nombre de commits, suivie d'un tiret, d'un g et d'un nom d'objet abrégé.

Un nom de référence symbolique. Par exemple. master signifie généralement l'objet commit référencé par $ GIT_DIR/refs/heads/master. Si vous avez à la fois des têtes/maîtres et des tags/maîtres, vous pouvez explicitement dire à têtes/maître de dire à git ce que vous voulez dire. Lorsque l'ambiguïté, a est désambiguïsé en prenant le premier match dans les règles suivantes:

si $ GIT_DIR/existe, c'est ce que vous voulez dire (c'est généralement utile seulement pour HEAD, FETCH_HEAD, ORIG_HEAD et MERGE_HEAD);

sinon, $ GIT_DIR/refs/if existe;

sinon, $ GIT_DIR/refs/tags/si existe;

sinon, $ GIT_DIR/refs/head/si existe;

sinon, $ GIT_DIR/refs/remotes/si existe;

sinon, $ GIT_DIR/refs/remotes // HEAD s'il existe.

HEAD nomme le commit sur lequel sont basées vos modifications dans l’arbre de travail. FETCH_HEAD enregistre la branche que vous avez extraite d'un référentiel distant avec votre dernière invocation git-fetch. ORIG_HEAD est créé par des commandes qui déplacent votre HEAD de manière radicale, afin d’enregistrer la position du HEAD avant son fonctionnement, afin que vous puissiez modifier le bout de la branche en arrière. Etat avant de les exécuter facilement. MERGE_HEAD enregistre le ou les commit (s) que vous fusionnez dans votre branche lorsque vous exécutez git-merge.

Une référence suivie du suffixe @ avec une indication de date entourée d'une paire de accolades (par exemple {hier}, {1 mois 2 semaines 3 jours 1 heure 1 seconde il y a} ou {1979-02-26 18:30:00}) spécifiez la valeur de la référence à un moment antérieur. Ce suffixe peut uniquement être utilisé immédiatement après un nom de référence et la référence doit avoir un journal existant ($ GIT_DIR/logs /). Notez que cela recherche l’état de votre référence locale à un moment donné; Par exemple, ce qui était dans votre branche principale locale la semaine dernière. Si vous souhaitez consulter les commits effectués à certains moments, voir --since et --until.

Une référence suivie du suffixe @ avec une spécification ordinale entourée d'une paire d'accolades (par exemple {1}, {15}) pour spécifier la nième valeur antérieure de cette référence. Par exemple, maître @ {1} est la valeur antérieure immédiate de maître, tandis que maître @ {5} est la cinquième valeur antérieure de maître. Ce suffixe peut uniquement être utilisé immédiatement après un nom de référence et la référence doit avoir un journal existant ($ GIT_DIR/logs /).

Vous pouvez utiliser la construction @ avec une partie ref vide pour obtenir un re-journalisation de la branche en cours. Par exemple, si vous êtes sur la branche blabla, alors @ {1} signifie la même chose que blabla @ {1}.

La construction spéciale @ {-} signifie que la branche est extraite avant la branche actuelle.

Un suffixe ^ à un paramètre de révision signifie le premier parent de cet objet de validation. ^ signifie le th parent (c'est-à-dire que rev ^ équivaut à rev ^ 1). En règle spéciale, rev ^ 0 signifie le commit lui-même et est utilisé lorsque rev est le nom d'objet d'un objet tag qui fait référence à un objet commit.

Un suffixe ~ à un paramètre de révision signifie que l’objet commit est le grand-parent de la génération de l’objet commit nommé, après le premier parent. C'est à dire. rev ~ 3 est équivalent à rev ^^^, ce qui équivaut à rev ^ 1 ^ 1 ^ 1. Voir ci-dessous pour une illustration de l'utilisation de ce formulaire.

Un suffixe ^ suivi d'un nom de type d'objet placé entre accolades (par exemple, v0.99.8 ^ {commit}) signifie que l'objet peut être une balise et déréférence la balise de manière récursive jusqu'à ce qu'un objet de ce type soit trouvé ou que l'objet ne puisse pas être déréférencé. plus (dans ce cas, barf). rev ^ 0 présenté précédemment est un raccourci pour rev ^ {commit}.

Un suffixe ^ suivi d'une paire d'accolades vide (par exemple, v0.99.8 ^ {}) signifie que l'objet peut être une balise et déréférenciez la balise de manière récursive jusqu'à ce qu'un objet non-balise soit trouvé.

Deux points, suivis d'une barre oblique, suivis d'un texte: ceci nomme un commit dont le message commence par le texte spécifié. Ce nom renvoie le plus récent commit correspondant, accessible depuis n'importe quel ref. Si le message de validation commence par un!, Vous devez le répéter; la séquence spéciale:/!, suivie de quelque chose d'autre que! est réservé pour l'instant.

Un suffixe: suivi d'un chemin; cela nomme le blob ou l'arbre sur le chemin donné dans l'objet tree-ish nommé par la partie située avant les deux points.

Deux points, éventuellement suivis d'un numéro d'étape (0 à 3) et deux points, suivis d'un chemin; cela nomme un objet blob dans l'index au chemin donné. Le numéro d'étape manquant (et les deux-points qui le suivent) nomme une entrée d'étape 0. Lors d'une fusion, l'étape 1 correspond à l'ancêtre commun, l'étape 2 correspond à la version de la branche cible (généralement la branche actuelle) et l'étape 3 à la version de la branche en cours de fusion.

Voici une illustration de Jon Loeliger. Les deux nœuds de validation B et C sont les parents du nœud de validation A. Les commits parent sont ordonnés de gauche à droite.

G   H   I   J
 \ /     \ /
  D   E   F
   \  |  / \
    \ | /   |
     \|/    |
      B     C
       \   /
        \ /
         A
A =      = A^0
B = A^   = A^1     = A~1
C = A^2  = A^2
D = A^^  = A^1^1   = A~2
E = B^2  = A^^2
F = B^3  = A^^3
G = A^^^ = A^1^1^1 = A~3
H = D^2  = B^^2    = A^^^2  = A~2^2
I = F^   = B^3^    = A^^3^
J = F^2  = B^3^2   = A^^3^2
33
gahooa

gahooa donne la réponse complète. Le cas commun:

  • Nom d'une branche existante (par exemple, master)
  • Quelques premiers chiffres d'une somme de contrôle SHA1, mieux capturés à partir de gitk ou git log

Bienvenue dans le monde merveilleux de git. TMI est comparable au parcours ...

10
Norman Ramsey

Autre cas, lorsque vous utilisez Emacs: tapez simplement Ctrl-x v l pour répertorier toutes les révisions. Pour un débutant à git (mais pas à Emacs/CVS), j'ai été surpris de voir que les révisions sont répertoriées comme suit:

commit 8d5ab12cd76d5e6098e5894c8713ec605fd9f153

C'est certainement un changement rafraîchissant par rapport à la notation Major.minor.bugfix.build.

Ce qui est plus (agréablement) surprenant, c’est que Emacs gère git automatiquement sans avoir besoin de lui dire (via .emacs) qu’il doit faire référence à git au lieu de CVS. Assez étonnant.

Donc, pour résumer, quand Emacs demande une révision, entrez simplement ce nombre à 40 chiffres hexadécimaux.

0
WinWin

lorsque vous essayez de créer une branche pour la première fois, l'interface graphique de Git demande une expression de révision. Je crois comprendre que git a besoin d'une branche déjà créée et validée afin de suivre les modifications récemment apportées, telles que (nouvelle branche/modification de fichiers) jusqu'à comparez-le avec quelque chose (ici branche principale).

0
saurabh gautam