HEAD ~ vs HEAD ^ vs HEAD @ {} auch bekannt als Tilde vs Caret vs at Sign

76

HEAD ist ein Zeiger auf den aktuellen Zweig. Ich habe eine Vielzahl von Notationen für Vorfahren von HEAD gesehen, einschließlich

  • HEAD~2
  • HEAD^2
  • HEAD@{2}
  • HEAD~~
  • HEAD^^

Was bedeutet jeder der oben genannten Punkte genau? Wo ist die Dokumentation dazu?

Shaun Luttin
quelle
5
git help revisions
Andrew C
Mögliches Duplikat von Was ist der Unterschied zwischen HEAD ^ und HEAD ~ in Git?
Michael Freidgeim

Antworten:

96

Aus den Dokumenten hier .

  • HEAD~2 : 2 Commits älter als HEAD
  • HEAD^2 : das zweite Elternteil von HEAD, wenn HEAD eine Fusion war, sonst illegal
  • HEAD@{2} : bezieht sich auf die 3. Auflistung in der Übersicht von git reflog
  • HEAD~~ : 2 Commits älter als HEAD
  • HEAD^^ : 2 Commits älter als HEAD

Wenn HEAD eine Fusion war, dann

  • Das erste Elternteil ist der Zweig, in den wir uns zusammengeschlossen haben.
  • Das zweite übergeordnete Element ist der Zweig, den wir zusammengeführt haben.

Einige Kombinationen und Synonyme

First Parent    First Grandparent    Second Parent    Second Grandparent

HEAD~
HEAD^
HEAD~1          HEAD~2               HEAD^2           HEAD^2~        
HEAD^1          HEAD^^                                HEAD^2^ 
Tim
quelle
Der Dokumentationslink ist perfekt. Git Book v2 enthält viele nützliche Ergänzungen zu v1.
Shaun Luttin
4
HEAD~0ist das gleiche wie HEAD, wie Sie es erwarten würden. Etwas verwirrend HEAD^0ist auch das gleiche wie HEAD.
Vladimir Reshetnikov
3
Welches Symbol zu erinnern ist , die, wie ich finde es hilfreich , dass ^sieht aus wie zwei Zweige (unten links und unten rechts) verschmelzen zusammen in einem (am oberen Rand)
mareoraft
22

Git-Referenzsuffixe (^ N, ~ N, @ {...})

ref~ist eine Abkürzung für ref~1und bedeutet das erste Elternteil des Commits. ref~2bedeutet das erste Elternteil des Commits. ref~3bedeutet das erste Elternteil des ersten Elternteils des Commits. Und so weiter.

ref^ist eine Abkürzung für ref^1und bedeutet das erste Elternteil des Commits. ref^2Wenn sich die beiden jedoch unterscheiden, bedeutet dies, dass der zweite Elternteil des Commits (denken Sie daran, dass Commits zwei Elternteile haben können, wenn sie zusammengeführt werden).

Die Operatoren ^ und ~ können kombiniert werden.

Hier ist ein Diagramm, das zeigt, wie verschiedene Commits mit HEAD als Ausgangspunkt referenziert werden.
Geben Sie hier die Bildbeschreibung ein

src

Premraj
quelle
3

Ich zähle jeden ~oder ^meine "eine Ebene zurückgehen". Wenn neben ~(z. B. ~n) eine Zahl steht , fungiert n als Multiplikator. Wenn sich neben ^(z. B. ^n) eine Zahl befindet, ist n das n-te übergeordnete Element (oder die seitliche Bewegung von der Spaltenposition von links nach rechts in git log --graph).

Beispiel:

$ git log --oneline --graph 
*   29392c8 (HEAD -> master, tag: A) A
|\
| * a1ef6fd (tag: C) C
| |
|  \
*-. \   8ae20e9 (tag: B) B
|\ \ \
| | |/
| | *   03160db (tag: F) F
| | |\
| | | * 9df28cb (tag: J) J
| | * 2afd329 (tag: I) I
| * a77cb1f (tag: E) E
*   cd75703 (tag: D) D
|\
| * 3043d25 (tag: H) H
* 4ab0473 (tag: G) G

Koordinaten für die obigen Tags:

A =      = A^0
B = A^   = A^1     = A~1
C = 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

Die git log --online --graphAusgabe macht es schwierig zu erkennen, welche Commits sich auf derselben Ebene befinden. Hier ist eine weitere Darstellung (wobei "A" das letzte Commit ist und ältere Commits oben stehen):

G   H   I   J
 \ /     \ /
  D   E   F
   \  |  / \
    \ | /   |
     \|/    |
      B     C
       \   /
        \ /
         A

(Abbildungen aus Was ist der Unterschied zwischen HEAD ^ und HEAD ~ in Git? ).

mvanle
quelle