Question Quelle est la différence entre HEAD ^ et HEAD ~ dans Git?


Lorsque je spécifie un objet de commit ancêtre dans Git, je suis confus entre HEAD^ et HEAD~.

Les deux ont une version "numérotée" comme HEAD^3 et HEAD~2.

Ils me paraissent très similaires ou identiques, mais y a-t-il des différences entre le tilde et le caret?


485
2018-02-08 12:56


origine


Réponses:


HEAD^ signifie le premier parent de la pointe de la branche actuelle.

Rappelez-vous que les commits git peuvent avoir plus d'un parent. HEAD^ est court pour HEAD^1et vous pouvez aussi vous adresser HEAD^2 et ainsi de suite selon le cas.

Vous pouvez contacter les parents de n'importe quel engagement, pas seulement HEAD. Vous pouvez également revenir à travers les générations: par exemple, master~2 signifie le grand-parent de la pointe de la branche maîtresse, en favorisant le premier parent en cas d'ambiguïté. Ces spécificateurs peuvent être chaînés arbitrairement , par exemple., topic~3^2.

Pour tous les détails, voir "Spécification des révisions" dans le git rev-parse Documentation.

Pour avoir une représentation visuelle de l'idée, citons une partie de la documentation:

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 validations parentes sont ordonnées 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

427
2018-02-08 16:06



La différence entre HEAD^ et HEAD~ est bien décrit par l'illustration (de Jon Loeliger) trouvée sur http://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html.

Cette documentation peut être un peu obscure pour les débutants alors j'ai reproduit cette illustration ci-dessous:

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

299
2017-09-21 09:11



Tous les deux ~ et ^ se référer au parent du commit (~~ et ^^ tous deux se réfèrent au commit grand-parent, etc.) Mais ils diffèrent dans le sens quand ils sont utilisés avec des nombres:

  • ~2 veux dire deux niveaux dans la hiérarchie, via le premier parent si un commit a plus d'un parent

  • ^2 veux dire le deuxième parent où un commit a plus d'un parent (c'est-à-dire parce que c'est une fusion)

Ceux-ci peuvent être combinés, donc HEAD~2^3 veux dire HEADle troisième parent de commit de grand-père commit.


218
2018-05-17 18:55



Mes deux centimes...

enter image description here


206
2018-03-18 11:30



le ^<n> format vous permet de sélectionner le nième parent du commit (pertinent dans les fusions). le ~<n> format vous permet de sélectionner le nième commit ancêtre, toujours en suivant le premier parent. Voir git-rev-parseLa documentation de certains exemples.


31
2018-02-08 13:03



Voici une très bonne explication verbatim de http://www.paulboxley.com/blog/2011/06/git-caret-and-tilde :

ref~ est un raccourci pour ref~1 et signifie le premier parent du commit. ref~2 signifie le premier parent du premier parent du commit. ref~3 signifie le premier parent du premier parent du premier parent du commit. Etc.

ref^ est un raccourci pour ref^1 et signifie le premier parent du commit. Mais où les deux diffèrent est que ref^2 signifie le deuxième parent du commit (rappelez-vous, les commits peuvent avoir deux parents quand ils sont une fusion).

le ^ et ~ les opérateurs peuvent être combinés.

enter image description here


23
2018-03-27 12:24



Il convient de noter que git a aussi une syntaxe pour suivre "from-where-you-came" / "vouloir-retourner-maintenant" - par exemple, HEAD@{1}référencera l'endroit d'où vous avez sauté à un nouvel emplacement de validation.

Fondamentalement HEAD@{} les variables capturent l’historique du mouvement HEAD, et vous pouvez décider d’utiliser une tête particulière en examinant les reflogs de git en utilisant la commande git reflog.

Exemple:

0aee51f HEAD@{0}: reset: moving to HEAD@{5}
290e035 HEAD@{1}: reset: moving to HEAD@{7}
0aee51f HEAD@{2}: reset: moving to HEAD@{3}
290e035 HEAD@{3}: reset: moving to HEAD@{3}
9e77426 HEAD@{4}: reset: moving to HEAD@{3}
290e035 HEAD@{5}: reset: moving to HEAD@{3}
0aee51f HEAD@{6}: reset: moving to HEAD@{3}
290e035 HEAD@{7}: reset: moving to HEAD@{3}
9e77426 HEAD@{8}: reset: moving to HEAD@{3}
290e035 HEAD@{9}: reset: moving to HEAD@{1}
0aee51f HEAD@{10}: reset: moving to HEAD@{4}
290e035 HEAD@{11}: reset: moving to HEAD^
9e77426 HEAD@{12}: reset: moving to HEAD^
eb48179 HEAD@{13}: reset: moving to HEAD~
f916d93 HEAD@{14}: reset: moving to HEAD~
0aee51f HEAD@{15}: reset: moving to HEAD@{5}
f19fd9b HEAD@{16}: reset: moving to HEAD~1
290e035 HEAD@{17}: reset: moving to HEAD~2
eb48179 HEAD@{18}: reset: moving to HEAD~2
0aee51f HEAD@{19}: reset: moving to HEAD@{5}
eb48179 HEAD@{20}: reset: moving to HEAD~2
0aee51f HEAD@{21}: reset: moving to HEAD@{1}
f916d93 HEAD@{22}: reset: moving to HEAD@{1}
0aee51f HEAD@{23}: reset: moving to HEAD@{1}
f916d93 HEAD@{24}: reset: moving to HEAD^
0aee51f HEAD@{25}: commit (amend): 3rd commmit
35a7332 HEAD@{26}: checkout: moving from temp2_new_br to temp2_new_br
35a7332 HEAD@{27}: commit (amend): 3rd commmit
72c0be8 HEAD@{28}: commit (amend): 3rd commmit

Un exemple pourrait être que j'ai fait des commits locaux-> b-> c-> d puis je suis retourné en rejetant 2 commits pour vérifier mon code - git reset HEAD~2 - et ensuite je veux ramener ma tête à d - git reset HEAD@{1}.


16
2018-02-20 14:49



HEAD ^^^ est identique à HEAD ~ 3, en sélectionnant le troisième commit avant HEAD

HEAD ^ 2 spécifie la deuxième tête dans un commit de fusion


9
2018-02-08 13:01



  • HEAD ~ spécifie le premier parent sur une "branche"

  • HEAD ^ vous permet de sélectionner un parent spécifique du commit

Un exemple:

Si vous voulez suivre une branche latérale, vous devez spécifier quelque chose comme

master~209^2~15

7
2018-02-08 13:05