Was bedeutet das Caret (^) Zeichen?

124

Ich habe hier eine Antwort auf eine Frage gesehen , mit deren Hilfe eine gelöschte Datei in Git wiederhergestellt werden kann.

Die Lösung war

git checkout <deleting_commit>^ -- <deleted_file_path>

Was macht der Caret-Charakter ( ^)? Ich habe gesehen, wie es anderswo sehr nützliche Dinge in Git gemacht hat. Es ist magisch. Jemand verwöhnt es bitte für mich und sagt mir, was es tut?

Charles Ma
quelle
8
Zu Ihrer Information unter Windows: ^ funktioniert in der DOS-Shell nicht wie erwartet. Verwenden Sie Git Bash Shell und dann funktioniert es.
Cincinnati Joe
5
Das ist mir nicht einmal in den Sinn gekommen, als ich versucht habe, es zu benutzen (zu erraten, was es bedeutet). Das caret ( ^) ist das Escapezeichen in cmd.exe. Jedes Mal, wenn ich versucht habe, damit zu prüfen, ob es hilfreich ist, habe ich tatsächlich nichts übergeben, was erklärt, warum die Ergebnisse nie anders waren. > _> Dumme cmd.exe. Sie können es entkommen, indem Sie es verdoppeln oder zitieren: git log master^^odergit log "master^"
bambams

Antworten:

138

HEAD^ bedeutet das erste Elternteil der Spitze des aktuellen Zweigs.

Denken Sie daran, dass Git-Commits mehr als ein Elternteil haben können. HEAD^ist die Abkürzung für HEAD^1, und Sie können auch adressieren HEAD^2und so weiter nach Bedarf.

Sie können Eltern von jedem Commit erreichen, nicht nur HEAD. Sie können auch über Generationen zurückgehen: Dies master~2bedeutet beispielsweise, dass der Großelternteil der Spitze des Hauptzweigs bei Unklarheiten den ersten Elternteil bevorzugt. Diese Bezeich können beliebig verkettet werden, zum Beispiel , topic~3^2. Siehe verwandte Antwort zu Was ist der Unterschied zwischen HEAD^und HEAD~in Git?

Ausführliche Informationen finden Sie im Abschnitt „Festlegen von Revisionen“ von git rev-parse --help.

Greg Bacon
quelle
1
Aber warum gibt es HEAD^^^in der linearen Geschichte das dritte ältere Commit zurück, dh es entspricht HEAD~~~?
Vorac
1
@Vorac Für lineare Geschichte ja.
Greg Bacon
21

Es bedeutet "Eltern von". Bedeutet HEAD^also "das Elternteil des aktuellen KOPFES". Sie können sie sogar miteinander verketten: HEAD^^bedeutet "das Elternteil des Elternteils des aktuellen KOPFES" (dh der Großelternteil des aktuellen KOPFES), HEAD^^^bedeutet "das Elternteil des Elternteils des Elternteils des aktuellen KOPFES" und so weiter.

Mipadi
quelle
16

Das ^(Caret) kann auch zur Angabe von Bereichen verwendet werden .

Um festschreibbare Commits von einem Commit auszuschließen, wird eine Präfixnotation verwendet. Zum Beispiel bedeutet ^ r1 r2 Commits, die von r2 aus erreichbar sind, aber diejenigen ausschließen, die von r1 aus erreichbar sind.

<rev>

Schließen Sie Commits ein, die von (dh Vorfahren von) aus erreichbar sind.

^ <rev>

Schließen Sie Commits aus, die von (dh Vorfahren von) erreichbar sind.

cmcginty
quelle
10

Hier ist eine visuelle Erklärung. Angenommen, Sie haben eine Geschichte wie diese:

                      master  
  ... <- B <- C <- D
             /
... <- E <- F
              feature

Wenn das Feature mit dem Master zusammengeführt wurde, Cwurde es mit zwei Vorfahren erstellt. Git weist diesen Vorfahren Nummern zu. Dem Hauptvorfahren Bwird 1 und dem Feature-Vorfahren F2 zugewiesen.

So C^1bezieht sich auf Bund C^2bezieht sich auf F. C^ist ein Alias ​​für C^1.

Sie würden immer nur verwenden <rev>^3. wenn Sie eine Zusammenführung von drei Zweigen durchgeführt hätten.

cdosborn
quelle
7

Das Caret bezieht sich auf das Elternteil eines bestimmten Commits. ZB HEAD^bezieht sich auf das übergeordnete Element des aktuellen HEAD-Commmit. ( HEAD^^bezieht sich auch auf den Großelternteil).

Mopoke
quelle
4

Das Karat repräsentiert einen Commit-Offset (Eltern). So HEAD^bedeutet beispielsweise "ein Commit von HEAD" und HEAD^^^"drei Commits von HEAD".

Bernstein
quelle
4

Das (^) erhält die übergeordnete Quelle des Befehls, dh HEAD ^ erhält die übergeordnete Quelle von HEAD.

GROSSER JUNGE
quelle