English ▾ Themen ▾ Neueste Version ▾ gitrevisions zuletzt aktualisiert in 2.42.0

NAME

gitrevisions - Revisionen und Bereiche für Git spezifizieren

SYNOPSIS

gitrevisions

BESCHREIBUNG

Viele Git-Befehle nehmen Revisionsparameter als Argumente entgegen. Abhängig vom Befehl bezeichnen sie einen bestimmten Commit oder, für Befehle, die den Revisionsgraphen durchlaufen (wie git-log[1]), alle Commits, die von diesem Commit erreichbar sind. Für Befehle, die den Revisionsgraphen durchlaufen, kann auch explizit ein Bereich von Revisionen angegeben werden.

Zusätzlich können einige Git-Befehle (wie git-show[1] und git-push[1]) auch Revisionsparameter entgegennehmen, die andere Objekte als Commits bezeichnen, z. B. Blobs ("Dateien") oder Trees ("Verzeichnisse von Dateien").

REVISIONEN SPEZIFIZIEREN

Ein Revisionsparameter <rev> benennt typischerweise, aber nicht zwangsläufig, ein Commit-Objekt. Er verwendet die sogenannte erweiterte SHA-1 Syntax. Hier sind verschiedene Möglichkeiten, Objektnamen zu schreiben. Die am Ende der Liste genannten benennen Trees und Blobs, die in einem Commit enthalten sind.

Hinweis
Dieses Dokument zeigt die "rohe" Syntax, wie sie von Git gesehen wird. Die Shell und andere Benutzeroberflächen benötigen möglicherweise zusätzliche Anführungszeichen, um Sonderzeichen zu schützen und Wortaufteilung zu vermeiden.
<sha1>, z. B. dae86e1950b1277e545cee180551750029cfe735, dae86e

Der vollständige SHA-1 Objektname (40-stellige hexadezimale Zeichenkette) oder ein führendes Teilzeichen, das im Repository eindeutig ist. Z. B. dae86e1950b1277e545cee180551750029cfe735 und dae86e bezeichnen beide das gleiche Commit-Objekt, wenn kein anderes Objekt in Ihrem Repository existiert, dessen Objektname mit dae86e beginnt.

<describeOutput>, z. B. v1.7.4.2-679-g3bee7fb

Ausgabe von git describe; d. h. ein nächstgelegener Tag, optional gefolgt von einem Bindestrich und einer Anzahl von Commits, gefolgt von einem Bindestrich, einem g und einem abgekürzten Objektnamen.

<refname>, z. B. master, heads/master, refs/heads/master

Ein symbolischer Ref-Name. Z. B. bedeutet master typischerweise das Commit-Objekt, auf das von refs/heads/master verwiesen wird. Wenn Sie sowohl heads/master als auch tags/master haben, können Sie explizit heads/master sagen, um Git mitzuteilen, welches Sie meinen. Bei Mehrdeutigkeit wird ein <refname> durch den ersten Treffer in den folgenden Regeln disambiguiert

  1. Wenn $GIT_DIR/<refname> existiert, ist das, was Sie meinen (dies ist normalerweise nur nützlich für HEAD, FETCH_HEAD, ORIG_HEAD, MERGE_HEAD, REBASE_HEAD, REVERT_HEAD, CHERRY_PICK_HEAD, BISECT_HEAD und AUTO_MERGE);

  2. andernfalls refs/<refname>, wenn es existiert;

  3. andernfalls refs/tags/<refname>, wenn es existiert;

  4. andernfalls refs/heads/<refname>, wenn es existiert;

  5. andernfalls refs/remotes/<refname>, wenn es existiert;

  6. andernfalls refs/remotes/<refname>/HEAD, wenn es existiert.

    HEAD

    benennt den Commit, auf dem Sie die Änderungen im Arbeitsverzeichnis basieren.

    FETCH_HEAD

    zeichnet den Branch auf, von dem Sie mit Ihrem letzten git fetch Aufruf aus einem Remote-Repository geholt haben.

    ORIG_HEAD

    wird von Befehlen erstellt, die Ihren HEAD drastisch bewegen (git am, git merge, git rebase, git reset), um die Position des HEAD vor ihrer Ausführung aufzuzeichnen, damit Sie die Spitze des Branches einfach auf den Zustand vor der Ausführung zurücksetzen können.

    MERGE_HEAD

    zeichnet den Commit (die Commits) auf, die Sie in Ihren Branch mergen, wenn Sie git merge ausführen.

    REBASE_HEAD

    zeichnet während eines Rebase den Commit auf, bei dem die Operation derzeit stoppt, entweder wegen Konflikten oder einem edit Befehl in einem interaktiven Rebase.

    REVERT_HEAD

    zeichnet den Commit auf, den Sie reverten, wenn Sie git revert ausführen.

    CHERRY_PICK_HEAD

    zeichnet den Commit auf, den Sie cherry-picken, wenn Sie git cherry-pick ausführen.

    BISECT_HEAD

    zeichnet den aktuellen zu testenden Commit auf, wenn Sie git bisect --no-checkout ausführen.

    AUTO_MERGE

    zeichnet ein Tree-Objekt, das den Zustand des Arbeitsverzeichnisses repräsentiert, wie er von der ort Merge-Strategie geschrieben wurde, als eine Merge-Operation zu Konflikten führte.

Beachten Sie, dass jede der obigen refs/* Fälle entweder aus dem Verzeichnis $GIT_DIR/refs oder aus der Datei $GIT_DIR/packed-refs stammen kann. Obwohl die Kodierung des Ref-Namens nicht spezifiziert ist, wird UTF-8 bevorzugt, da einige Ausgabeverarbeitung Ref-Namen in UTF-8 annehmen kann.

@

@ allein ist eine Abkürzung für HEAD.

[<refname>]@{<date>}, z. B. master@{yesterday}, HEAD@{5 minutes ago}

Ein Ref, gefolgt vom Suffix @ mit einer Datumsangabe in geschweiften Klammern (z. B. {yesterday}, {1 month 2 weeks 3 days 1 hour 1 second ago} oder {1979-02-26 18:30:00}) bezeichnet den Wert des Refs zu einem früheren Zeitpunkt. Dieses Suffix kann nur unmittelbar nach einem Ref-Namen verwendet werden und der Ref muss ein vorhandenes Log haben ($GIT_DIR/logs/<ref>). Beachten Sie, dass dies den Zustand Ihres lokalen Refs zu einer bestimmten Zeit nachschlägt; z. B. was letzte Woche in Ihrem lokalen master Branch war. Wenn Sie Commits zu bestimmten Zeiten betrachten möchten, siehe --since und --until.

<refname>@{<n>}, z. B. master@{1}

Ein Ref, gefolgt vom Suffix @ mit einer ordinalen Angabe in geschweiften Klammern (z. B. {1}, {15}) bezeichnet den n-ten vorherigen Wert dieses Refs. Zum Beispiel ist master@{1} der unmittelbar vorherige Wert von master, während master@{5} der 5. vorherige Wert von master ist. Dieses Suffix kann nur unmittelbar nach einem Ref-Namen verwendet werden und der Ref muss ein vorhandenes Log haben ($GIT_DIR/logs/<refname>).

@{<n>}, z. B. @{1}

Sie können die @-Konstruktion mit einem leeren Ref-Teil verwenden, um auf einen Reflog-Eintrag des aktuellen Branches zuzugreifen. Zum Beispiel, wenn Sie sich auf dem Branch blabla befinden, bedeutet @{1} das Gleiche wie blabla@{1}.

@{-<n>}, z. B. @{-1}

Die Konstruktion @{-<n>} bezeichnet den <n>-ten Branch/Commit, der vor dem aktuellen ausgecheckt wurde.

[<branchname>]@{upstream}, z. B. master@{upstream}, @{u}

Ein Branch B kann so konfiguriert werden, dass er auf einem Branch X (konfiguriert mit branch.<name>.merge) auf einem Remote R (konfiguriert mit branch.<name>.remote) aufbaut. B@{u} bezeichnet den Remote-Tracking-Branch für den Branch X, genommen von Remote R, typischerweise zu finden unter refs/remotes/R/X.

[<branchname>]@{push}, z. B. master@{push}, @{push}

Das Suffix @{push} gibt den Branch an, "wohin wir pushen würden", wenn git push ausgeführt würde, während branchname ausgecheckt war (oder der aktuelle HEAD, wenn kein branchname angegeben ist). Wie bei @{upstream} geben wir den Remote-Tracking-Branch an, der diesem Branch auf dem Remote entspricht.

Hier ist ein Beispiel zur Verdeutlichung

$ git config push.default current
$ git config remote.pushdefault myfork
$ git switch -c mybranch origin/master

$ git rev-parse --symbolic-full-name @{upstream}
refs/remotes/origin/master

$ git rev-parse --symbolic-full-name @{push}
refs/remotes/myfork/mybranch

Beachten Sie im Beispiel, dass wir einen dreieckigen Workflow eingerichtet haben, bei dem wir von einem Ort ziehen und zu einem anderen pushen. In einem nicht-dreieckigen Workflow ist @{push} dasselbe wie @{upstream}, und es wird nicht benötigt.

Dieses Suffix wird auch in Großbuchstaben akzeptiert und bedeutet dasselbe, unabhängig von der Groß-/Kleinschreibung.

<rev>^[<n>], z. B. HEAD^, v1.5.1^0

Ein Suffix ^ zu einem Revisionsparameter bedeutet den ersten Elternteil dieses Commit-Objekts. ^<n> bedeutet den <n>-ten Elternteil (d. h. <rev>^ ist äquivalent zu <rev>^1). Als Sonderregel bedeutet <rev>^0 den Commit selbst und wird verwendet, wenn <rev> der Objektname eines Tag-Objekts ist, das auf ein Commit-Objekt verweist.

<rev>~[<n>], z. B. HEAD~, master~3

Ein Suffix ~ zu einem Revisionsparameter bedeutet den ersten Elternteil dieses Commit-Objekts. Ein Suffix ~<n> zu einem Revisionsparameter bedeutet das Commit-Objekt, das die <n>-te Generation des benannten Commit-Objekts als Vorfahre ist, nur den ersten Elternteilen folgend. D. h. <rev>~3 ist äquivalent zu <rev>^^^, was wiederum äquivalent ist zu <rev>^1^1^1. Siehe unten für eine Illustration der Verwendung dieser Form.

<rev>^{<type>}, z. B. v0.99.8^{commit}

Ein Suffix ^, gefolgt von einem Objekttypnamen in geschweiften Klammern, bedeutet, das Objekt bei <rev> rekursiv zu dereferenzieren, bis ein Objekt vom Typ <type> gefunden wird oder das Objekt nicht mehr dereferenziert werden kann (in diesem Fall fehlschlagen). Zum Beispiel, wenn <rev> ein Commit-ish ist, beschreibt <rev>^{commit} das entsprechende Commit-Objekt. Ebenso, wenn <rev> ein Tree-ish ist, beschreibt <rev>^{tree} das entsprechende Tree-Objekt. <rev>^0 ist eine Kurzform für <rev>^{commit}.

<rev>^{object} kann verwendet werden, um sicherzustellen, dass <rev> ein existierendes Objekt benennt, ohne zu verlangen, dass <rev> ein Tag ist, und ohne <rev> zu dereferenzieren; da ein Tag bereits ein Objekt ist, muss er nicht einmal dereferenziert werden, um zu einem Objekt zu gelangen.

<rev>^{tag} kann verwendet werden, um sicherzustellen, dass <rev> ein existierendes Tag-Objekt identifiziert.

<rev>^{}, z. B. v0.99.8^{}

Ein Suffix ^, gefolgt von einem leeren Klammerpaar, bedeutet, dass das Objekt ein Tag sein könnte, und dereferenziert den Tag rekursiv, bis ein Nicht-Tag-Objekt gefunden wird.

<rev>^{/<text>}, z. B. HEAD^{/fix nasty bug}

Ein Suffix ^ zu einem Revisionsparameter, gefolgt von einem Klammerpaar, das einen Text mit einem Schrägstrich enthält, ist dasselbe wie die :/fix nasty bug Syntax unten, außer dass er den jüngsten übereinstimmenden Commit zurückgibt, der von <rev> vor ^ erreichbar ist.

:/<text>, z. B. :/fix nasty bug

Ein Doppelpunkt, gefolgt von einem Schrägstrich, gefolgt von einem Text, benennt einen Commit, dessen Commit-Nachricht dem angegebenen regulären Ausdruck entspricht. Dieser Name gibt den jüngsten übereinstimmenden Commit zurück, der von jedem Ref, einschließlich HEAD, erreichbar ist. Der reguläre Ausdruck kann jeden Teil der Commit-Nachricht abgleichen. Um Nachrichten zu finden, die mit einer Zeichenkette beginnen, kann man z. B. :/^foo verwenden. Die spezielle Sequenz :/! ist für Modifikatoren dessen, was abgeglichen wird, reserviert. :/!-foo führt einen negativen Abgleich durch, während :/!!foo ein literales ! gefolgt von foo abgleicht. Jede andere Sequenz, die mit :/! beginnt, ist derzeit reserviert. Abhängig vom gegebenen Text erfordern die Wortaufteilungsregeln der Shell möglicherweise zusätzliche Anführungszeichen.

<rev>:<path>, z. B. HEAD:README, master:./README

Ein Suffix :, gefolgt von einem Pfad, benennt den Blob oder Tree am angegebenen Pfad im Tree-ish-Objekt, das durch den Teil vor dem Doppelpunkt benannt wird. Ein Pfad, der mit ./ oder ../ beginnt, ist relativ zum aktuellen Arbeitsverzeichnis. Der angegebene Pfad wird in einen Pfad relativ zum Stammverzeichnis des Arbeitsbaums konvertiert. Dies ist am nützlichsten, um einen Blob oder Tree von einem Commit oder Tree anzusprechen, der die gleiche Baumstruktur wie der Arbeitsbaum hat.

:[<n>:]<path>, z. B. :0:README, :README

Ein Doppelpunkt, optional gefolgt von einer Stufennummer (0 bis 3) und einem Doppelpunkt, gefolgt von einem Pfad, benennt ein Blob-Objekt im Index am angegebenen Pfad. Eine fehlende Stufennummer (und der folgende Doppelpunkt) benennt einen Eintrag der Stufe 0. Während eines Merges ist Stufe 1 der gemeinsame Vorfahre, Stufe 2 ist die Version des Zielbranches (typischerweise der aktuelle Branch), und Stufe 3 ist die Version des Branches, der gemerged wird.

Hier ist eine Illustration von Jon Loeliger. Sowohl die Commit-Knoten B als auch C sind Eltern von Commit-Knoten A. Eltern-Commits sind von links nach rechts geordnet.

G   H   I   J
 \ /     \ /
  D   E   F
   \  |  / \
    \ | /   |
     \|/    |
      B     C
       \   /
        \ /
         A
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

BEREICHE ANGEBEN

Befehle zur Verfolgung der Historie wie git log arbeiten auf einer Menge von Commits, nicht nur auf einem einzelnen Commit.

Für diese Befehle bedeutet die Angabe einer einzelnen Revision, die die Notation aus dem vorherigen Abschnitt verwendet, die Menge der von dem angegebenen Commit erreichbaren Commits.

Die Angabe mehrerer Revisionen bedeutet die Menge der von einem der angegebenen Commits erreichbaren Commits.

Die erreichbare Menge eines Commits ist der Commit selbst und die Commits in seiner Ahnenkette.

Es gibt verschiedene Notationen, um eine Menge von verbundenen Commits zu spezifizieren (genannt "Revisionsbereich"), die unten illustriert sind.

Commit-Ausschlüsse

^<rev> (Caret) Notation

Um von einem Commit erreichbare Commits auszuschließen, wird eine Präfix-^ Notation verwendet. Z. B. bedeutet ^r1 r2 Commits, die von r2 erreichbar sind, aber die von r1 erreichbaren ausschließen (d. h. r1 und seine Vorfahren).

Punktierte Bereichsnotationen

Die .. (Zwei-Punkte) Bereichsnotation

Die Mengenoperation ^r1 r2 erscheint so oft, dass es dafür eine Abkürzung gibt. Wenn Sie zwei Commits r1 und r2 haben (benannt gemäß der im Abschnitt REVISIONEN SPEZIFIZIEREN erklärten Syntax), können Sie Commits, die von r2 erreichbar sind, aber nicht die von r1 erreichbaren, mit ^r1 r2 abfragen, und dies kann als r1..r2 geschrieben werden.

Die ... (Drei-Punkte) Symmetrische Differenznotation

Eine ähnliche Notation r1...r2 wird als symmetrische Differenz von r1 und r2 bezeichnet und definiert als r1 r2 --not $(git merge-base --all r1 r2). Sie ist die Menge der Commits, die entweder von r1 (linke Seite) oder r2 (rechte Seite) erreichbar sind, aber nicht von beiden.

In diesen beiden Kurzschreibweisen können Sie ein Ende weglassen und es standardmäßig auf HEAD setzen. Zum Beispiel ist origin.. eine Abkürzung für origin..HEAD und fragt "Was habe ich getan, seit ich vom Origin-Branch abgezweigt bin?" Ebenso ist ..origin eine Abkürzung für HEAD..origin und fragt "Was hat der Origin getan, seit ich von ihnen abgezweigt bin?" Beachten Sie, dass .. HEAD..HEAD bedeuten würde, was ein leerer Bereich ist, der sowohl von HEAD erreichbar als auch unerreichbar ist.

Befehle, die speziell dafür entwickelt wurden, zwei verschiedene Bereiche entgegenzunehmen (z. B. "git range-diff R1 R2" zum Vergleichen zweier Bereiche), existieren, aber sie sind Ausnahmen. Sofern nicht anders angegeben, arbeiten alle "git"-Befehle, die auf eine Menge von Commits angewendet werden, auf einem einzigen Revisionsbereich. Mit anderen Worten, zwei "Zwei-Punkte-Bereichsnotationen" nebeneinander zu schreiben, z. B.

$ git log A..B C..D

spezifiziert für die meisten Befehle **nicht** zwei Revisionsbereiche. Stattdessen benennt es eine einzige verbundene Menge von Commits, d. h. diejenigen, die von B oder D erreichbar sind, aber weder von A noch von C erreichbar sind. In einer linearen Historie wie dieser

---A---B---o---o---C---D

da A und B von C erreichbar sind, ist der durch diese beiden punktierten Bereiche angegebene Revisionsbereich ein einzelner Commit D.

Andere <rev>^ Eltern-Kurzschreibweisen

Drei weitere Kurzschreibweisen existieren, besonders nützlich für Merge-Commits, um eine Menge zu benennen, die aus einem Commit und seinen Eltern-Commits besteht.

Die Notation r1^@ bedeutet alle Eltern von r1.

Die Notation r1^! schließt den Commit r1 ein, schließt aber alle seine Eltern aus. Allein bezeichnet diese Notation den einzelnen Commit r1.

Die Notation <rev>^-[<n>] schließt <rev> ein, schließt aber den <n>-ten Elternteil aus (d. h. eine Abkürzung für <rev>^<n>..<rev>), wobei <n> = 1 ist, wenn nicht angegeben. Dies ist typischerweise nützlich für Merge-Commits, bei denen man einfach <commit>^- übergeben kann, um alle Commits im Branch zu erhalten, der in den Merge-Commit <commit> gemerged wurde (einschließlich <commit> selbst).

Während <rev>^<n> sich auf die Angabe eines einzelnen Eltern-Commits bezog, berücksichtigen diese drei Notationen auch seine Eltern. Zum Beispiel kann man HEAD^2^@ sagen, aber man kann nicht HEAD^@^2 sagen.

Zusammenfassung der Revisionsbereiche

<rev>

Schließt Commits ein, die von <rev> erreichbar sind (d. h. <rev> und seine Vorfahren).

^<rev>

Schließt Commits aus, die von <rev> erreichbar sind (d. h. <rev> und seine Vorfahren).

<rev1>..<rev2>

Schließt Commits ein, die von <rev2> erreichbar sind, schließt aber diejenigen aus, die von <rev1> erreichbar sind. Wenn entweder <rev1> oder <rev2> weggelassen wird, wird standardmäßig HEAD verwendet.

<rev1>...<rev2>

Schließt Commits ein, die von entweder <rev1> oder <rev2> erreichbar sind, schließt aber diejenigen aus, die von beiden erreichbar sind. Wenn entweder <rev1> oder <rev2> weggelassen wird, wird standardmäßig HEAD verwendet.

<rev>^@, z. B. HEAD^@

Ein Suffix ^ gefolgt von einem At-Zeichen ist dasselbe wie das Auflisten aller Eltern von <rev> (bedeutet, schließt alles ein, was von seinen Eltern erreichbar ist, aber nicht den Commit selbst).

<rev>^!, z. B. HEAD^!

Ein Suffix ^ gefolgt von einem Ausrufezeichen ist dasselbe wie die Angabe des Commits <rev> und aller seiner Eltern, die mit ^ präfigiert sind, um sie (und ihre Vorfahren) auszuschließen.

<rev>^-<n>, z. B. HEAD^-, HEAD^-2

Äquivalent zu <rev>^<n>..<rev>, mit <n> = 1, wenn nicht gegeben.

Hier sind einige Beispiele unter Verwendung der obigen Loeliger-Illustration, wobei jeder Schritt der Notationerweiterung und -auswahl sorgfältig aufgeschlüsselt ist

   Args   Expanded arguments    Selected commits
   D                            G H D
   D F                          G H I J D F
   ^G D                         H D
   ^D B                         E I J F B
   ^D B C                       E I J F B C
   C                            I J F C
   B..C   = ^B C                C
   B...C  = B ^F C              G H D E B C
   B^-    = B^..B
	  = ^B^1 B              E I J F B
   C^@    = C^1
	  = F                   I J F
   B^@    = B^1 B^2 B^3
	  = D E F               D G H E F I J
   C^!    = C ^C^@
	  = C ^C^1
	  = C ^F                C
   B^!    = B ^B^@
	  = B ^B^1 ^B^2 ^B^3
	  = B ^D ^E ^F          B
   F^! D  = F ^I ^J D           G H D F

SIEHE AUCH

GIT

Teil der git[1] Suite