HEAD ist ein Zeiger auf den aktuellen Zweig. Ich habe eine Vielzahl von Notationen für Vorfahren von HEAD gesehen, einschließlich
HEAD~2HEAD^2HEAD@{2}HEAD~~HEAD^^
Was bedeutet jeder der oben genannten Punkte genau? Wo ist die Dokumentation dazu?
HEAD ist ein Zeiger auf den aktuellen Zweig. Ich habe eine Vielzahl von Notationen für Vorfahren von HEAD gesehen, einschließlich
HEAD~2HEAD^2HEAD@{2}HEAD~~HEAD^^Was bedeutet jeder der oben genannten Punkte genau? Wo ist die Dokumentation dazu?
git help revisions
Antworten:
Aus den Dokumenten hier .
HEAD~2 : 2 Commits älter als HEADHEAD^2 : das zweite Elternteil von HEAD, wenn HEAD eine Fusion war, sonst illegalHEAD@{2} : bezieht sich auf die 3. Auflistung in der Übersicht von git reflogHEAD~~ : 2 Commits älter als HEADHEAD^^ : 2 Commits älter als HEADWenn HEAD eine Fusion war, dann
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^
HEAD~0ist das gleiche wie HEAD, wie Sie es erwarten würden. Etwas verwirrend HEAD^0ist auch das gleiche wie HEAD.
^sieht aus wie zwei Zweige (unten links und unten rechts) verschmelzen zusammen in einem (am oberen Rand)
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.
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? ).