English ▾ Themen ▾ Neueste Version ▾ git-replay zuletzt aktualisiert in 2.52.0

NAME

git-replay - EXPERIMENTAL: Commits auf einer neuen Basis neu abspielen, funktioniert auch mit Bare-Repositories

SYNOPSIS

(EXPERIMENTAL!) git replay ([--contained] --onto <newbase> | --advance <branch>) <revision-range>…​

BESCHREIBUNG

Nimmt Commit-Bereiche und spielt sie auf einem neuen Ort neu ab. Lässt den Arbeitsbaum und den Index unverändert und aktualisiert keine Referenzen. Die Ausgabe dieses Befehls ist zur Verwendung als Eingabe für git update-ref --stdin vorgesehen, welches die relevanten Branches aktualisieren würde (siehe unten im Abschnitt OUTPUT).

DIESER BEFEHL IST EXPERIMENTELL. DAS VERHALTEN KANN SICH ÄNDERN.

OPTIONEN

--onto <newbase>

Startpunkt, an dem die neuen Commits erstellt werden sollen. Kann ein beliebiger gültiger Commit sein, nicht nur ein vorhandener Branch-Name.

Wenn --onto angegeben ist, werden die im Output enthaltenen `update-ref`-Befehle die Branches im Commit-Bereich so aktualisieren, dass sie auf die neuen Commits zeigen, ähnlich wie git rebase --update-refs mehrere Branches im betroffenen Bereich aktualisiert.

--advance <branch>

Startpunkt, an dem die neuen Commits erstellt werden sollen; muss ein Branch-Name sein.

Wenn --advance angegeben ist, werden die im Output enthaltenen `update-ref`-Befehle den als Argument an --advance übergebenen Branch so aktualisieren, dass er auf die neuen Commits zeigt (mit anderen Worten, dies ahmt eine Cherry-Pick-Operation nach).

<revision-range>

Bereich der neu abzuspielenden Commits. Es können mehr als ein <revision-range> übergeben werden, aber im --advance <branch>-Modus sollten sie eine einzelne Spitze haben, damit klar ist, worauf <branch> zeigen soll. Siehe "Angabe von Bereichen" in git-rev-parse[1] und die Optionen unter "Commit-Einschränkung" unten.

Commit-Limitierung

Zusätzlich zur Angabe eines Commit-Bereichs, der mithilfe der speziellen Notationen, die in der Beschreibung erläutert werden, aufgelistet werden soll, können weitere Commit-Limitierungen angewendet werden.

Die Verwendung von mehr Optionen beschränkt in der Regel die Ausgabe weiter (z. B. beschränkt --since=<date1> auf neuere Commits als <date1>, und die Verwendung mit --grep=<pattern> schränkt weiter auf Commits ein, deren Log-Nachricht eine Zeile enthält, die <pattern> entspricht), sofern nicht anders angegeben.

Beachten Sie, dass diese Optionen vor Commit-Sortier- und Formatierungsoptionen wie --reverse angewendet werden.

-<number>
-n <number>
--max-count=<number>

Begrenzt die Ausgabe auf <number> Commits.

--skip=<number>

Überspringt <number> Commits, bevor die Commit-Ausgabe angezeigt wird.

--since=<date>
--after=<date>

Zeigt Commits neuer als <date> an.

--since-as-filter=<date>

Zeigt alle Commits neuer als <date> an. Dabei werden alle Commits im Bereich durchlaufen, anstatt beim ersten Commit anzuhalten, der älter als <date> ist.

--until=<date>
--before=<date>

Zeigt Commits älter als <date> an.

--author=<pattern>
--committer=<pattern>

Beschränkt die Ausgabe von Commits auf solche, deren Autor-/Committer-Headerzeilen dem regulären Ausdruck <pattern> entsprechen. Bei mehr als einem --author=<pattern> werden Commits ausgewählt, deren Autor eines der <pattern> erfüllt (ähnlich für mehrere --committer=<pattern>).

--grep-reflog=<pattern>

Beschränkt die Ausgabe von Commits auf solche mit Reflog-Einträgen, die dem regulären Ausdruck <pattern> entsprechen. Bei mehr als einem --grep-reflog werden Commits ausgewählt, deren Reflog-Nachricht einem der angegebenen Muster entspricht. Es ist ein Fehler, diese Option zu verwenden, es sei denn, --walk-reflogs wird verwendet.

--grep=<pattern>

Beschränkt die Ausgabe von Commits auf solche mit einer Log-Nachricht, die dem regulären Ausdruck <pattern> entspricht. Bei mehr als einem --grep=<pattern> werden Commits ausgewählt, deren Nachricht einem der <pattern> entspricht (aber siehe --all-match).

Wenn --notes aktiv ist, wird die Nachricht aus den Notizen so abgeglichen, als wäre sie Teil der Log-Nachricht.

--all-match

Beschränkt die Ausgabe von Commits auf solche, die allen angegebenen --grep-Mustern entsprechen, anstatt solchen, die mindestens einem entsprechen.

--invert-grep

Beschränkt die Ausgabe von Commits auf solche mit einer Log-Nachricht, die nicht dem mit --grep=<pattern> angegebenen <pattern> entsprechen.

-i
--regexp-ignore-case

Gleicht die regulären Ausdrucksmuster für die Beschränkung ohne Berücksichtigung der Groß- und Kleinschreibung ab.

--basic-regexp

Betrachtet die Muster für die Beschränkung als grundlegende reguläre Ausdrücke; dies ist der Standard.

-E
--extended-regexp

Betrachtet die Muster für die Beschränkung als erweiterte reguläre Ausdrücke anstelle der standardmäßigen grundlegenden regulären Ausdrücke.

-F
--fixed-strings

Betrachtet die Muster für die Beschränkung als feste Zeichenketten (interpretiert Muster nicht als regulären Ausdruck).

-P
--perl-regexp

Betrachtet die Muster für die Beschränkung als Perl-kompatible reguläre Ausdrücke.

Die Unterstützung für diese Arten von regulären Ausdrücken ist eine optionale Abhängigkeit zur Kompilierzeit. Wenn Git nicht mit Unterstützung dafür kompiliert wurde, führt die Bereitstellung dieser Option zum Abbruch.

--remove-empty

Stoppt, wenn ein bestimmter Pfad aus dem Baum verschwindet.

--merges

Gibt nur Merge-Commits aus. Dies ist exakt dasselbe wie --min-parents=2.

--no-merges

Gibt keine Commits mit mehr als einem Elternteil aus. Dies ist exakt dasselbe wie --max-parents=1.

--min-parents=<number>
--max-parents=<number>
--no-min-parents
--no-max-parents

Zeigt nur Commits an, die mindestens (oder höchstens) so viele Eltern-Commits haben. Insbesondere ist --max-parents=1 dasselbe wie --no-merges, --min-parents=2 ist dasselbe wie --merges. --max-parents=0 gibt alle Wurzel-Commits und --min-parents=3 alle Octopus-Merges aus.

--no-min-parents und --no-max-parents setzen diese Limits wieder auf keine Begrenzung zurück. Äquivalente Formen sind --min-parents=0 (jeder Commit hat 0 oder mehr Eltern) und --max-parents=-1 (negative Zahlen bedeuten keine Obergrenze).

--first-parent

Bei der Suche nach einzubeziehenden Commits wird nur dem ersten Eltern-Commit gefolgt, wenn ein Merge-Commit angetroffen wird. Diese Option kann eine bessere Übersicht beim Betrachten der Entwicklung eines bestimmten Topic-Branches geben, da Merges in einen Topic-Branch tendenziell nur dazu dienen, von Zeit zu Zeit mit dem aktualisierten Upstream synchron zu werden. Diese Option erlaubt es Ihnen, die einzelnen Commits zu ignorieren, die durch einen solchen Merge in Ihre Historie gebracht wurden.

--exclude-first-parent-only

Bei der Suche nach auszuschließenden Commits (mit einem ^) wird nur dem ersten Eltern-Commit gefolgt, wenn ein Merge-Commit angetroffen wird. Dies kann verwendet werden, um die Menge der Änderungen in einem Topic-Branch ab dem Punkt zu finden, an dem er sich vom Remote-Branch abzweigte, vorausgesetzt, beliebige Merges können gültige Topic-Branch-Änderungen sein.

--not

Kehrt die Bedeutung des Präfixes ^ (oder des Fehlens davon) für alle folgenden Revisionsspezifizierer um, bis zum nächsten --not. Wenn es auf der Kommandozeile vor --stdin verwendet wird, werden die über stdin übergebenen Revisionen nicht davon beeinflusst. Umgekehrt werden, wenn es über die Standardeingabe übergeben wird, die auf der Kommandozeile übergebenen Revisionen nicht davon beeinflusst.

--all

Verhält sich so, als ob alle Refs in refs/ zusammen mit HEAD auf der Kommandozeile als <commit> aufgelistet wären.

--branches[=<pattern>]

Verhält sich so, als ob alle Refs in refs/heads auf der Kommandozeile als <commit> aufgelistet wären. Wenn <pattern> angegeben ist, werden die Branches auf diejenigen beschränkt, die dem angegebenen Shell-Glob-Muster entsprechen. Wenn <pattern> keine ?, * oder [ enthält, wird am Ende /* angenommen.

--tags[=<pattern>]

Verhält sich so, als ob alle Refs in refs/tags auf der Kommandozeile als <commit> aufgelistet wären. Wenn <pattern> angegeben ist, werden die Tags auf diejenigen beschränkt, die dem angegebenen Shell-Glob-Muster entsprechen. Wenn das Muster keine ?, * oder [ enthält, wird am Ende /* angenommen.

--remotes[=<pattern>]

Verhält sich so, als ob alle Refs in refs/remotes auf der Kommandozeile als <commit> aufgelistet wären. Wenn <pattern> angegeben ist, werden die Remote-Tracking-Branches auf diejenigen beschränkt, die dem angegebenen Shell-Glob-Muster entsprechen. Wenn das Muster keine ?, * oder [ enthält, wird am Ende /* angenommen.

--glob=<glob-pattern>

Verhält sich so, als ob alle Refs, die dem Shell-Glob-Muster <glob-pattern> entsprechen, auf der Kommandozeile als <commit> aufgelistet wären. Wenn das Präfix refs/ fehlt, wird es automatisch hinzugefügt. Wenn das Muster keine ?, * oder [ enthält, wird am Ende /* angenommen.

--exclude=<glob-pattern>

Schließt Refs aus, die dem Muster <glob-pattern> entsprechen und die der nächste --all, --branches, --tags, --remotes oder --glob sonst berücksichtigen würde. Wiederholungen dieser Option häufen Ausschlussmuster an bis zum nächsten --all, --branches, --tags, --remotes oder --glob Option (andere Optionen oder Argumente löschen keine angesammelten Muster).

Die angegebenen Muster dürfen nicht mit refs/heads, refs/tags oder refs/remotes beginnen, wenn sie auf --branches, --tags bzw. --remotes angewendet werden, und sie müssen mit refs/ beginnen, wenn sie auf --glob oder --all angewendet werden. Wenn ein nachgestelltes /* beabsichtigt ist, muss es explizit angegeben werden.

--exclude-hidden=(fetch|receive|uploadpack)

Schließt Refs aus, die von git-fetch, git-receive-pack oder git-upload-pack verborgen würden, indem die entsprechenden Konfigurationen fetch.hideRefs, receive.hideRefs oder uploadpack.hideRefs zusammen mit transfer.hideRefs konsultiert werden (siehe git-config[1]). Diese Option beeinflusst die nächste Pseudo-Ref-Option --all oder --glob und wird nach deren Verarbeitung gelöscht.

--reflog

Verhält sich so, als ob alle von Reflogs referenzierten Objekte auf der Kommandozeile als <commit> aufgelistet wären.

--alternate-refs

Verhält sich so, als ob alle Objekte, die als Ref-Spitzen von alternativen Repositories referenziert werden, auf der Kommandozeile aufgelistet wären. Ein alternatives Repository ist jedes Repository, dessen Objektverzeichnis in objects/info/alternates angegeben ist. Die Menge der eingeschlossenen Objekte kann durch core.alternateRefsCommand usw. modifiziert werden. Siehe git-config[1].

--single-worktree

Standardmäßig werden alle Arbeitsbäume von den folgenden Optionen untersucht, wenn mehr als einer vorhanden ist (siehe git-worktree[1]): --all, --reflog und --indexed-objects. Diese Option zwingt sie, nur den aktuellen Arbeitsbaum zu untersuchen.

--ignore-missing

Beim Ansehen eines ungültigen Objektnamens in der Eingabe, verhalten Sie sich so, als wäre die fehlerhafte Eingabe nicht gegeben worden.

--bisect

Verhält sich so, als ob die fehlerhafte Bisection-Ref refs/bisect/bad aufgelistet worden wäre und als ob darauf --not und die guten Bisection-Refs refs/bisect/good-* auf der Kommandozeile gefolgt wären.

--stdin

Zusätzlich zum Empfangen von Argumenten von der Kommandozeile werden diese auch von der Standardeingabe gelesen. Dies akzeptiert Commits und Pseudo-Optionen wie --all und --glob=. Wenn ein Trennzeichen -- gesehen wird, wird die folgende Eingabe als Pfade behandelt und zur Begrenzung des Ergebnisses verwendet. Flags wie --not, die über die Standardeingabe gelesen werden, werden nur für die auf die gleiche Weise übergebenen Argumente berücksichtigt und beeinflussen keine nachfolgenden Kommandozeilenargumente.

--cherry-mark

Ähnlich wie --cherry-pick (siehe unten), aber gleichwertige Commits werden mit = markiert anstatt weggelassen zu werden, und ungleichwertige mit +.

--cherry-pick

Lässt jeden Commit aus, der dieselbe Änderung wie ein anderer Commit auf der "anderen Seite" einführt, wenn die Menge der Commits durch symmetrische Differenz begrenzt wird.

Wenn Sie beispielsweise zwei Branches, A und B, haben, ist eine übliche Methode, alle Commits auf nur einer Seite davon aufzulisten, --left-right (siehe das Beispiel unten in der Beschreibung der --left-right Option). Allerdings werden die Commits angezeigt, die von dem anderen Branch cherry-picked wurden (z. B. "3rd on b" könnte von Branch A cherry-picked worden sein). Mit dieser Option werden solche Commit-Paare von der Ausgabe ausgeschlossen.

--left-only
--right-only

Listet nur Commits auf der jeweiligen Seite einer symmetrischen Differenz auf, d. h. nur diejenigen, die von --left-right als < bzw. > markiert würden.

Zum Beispiel lässt --cherry-pick --right-only A...B jene Commits aus B aus, die in A enthalten sind oder Patch-Äquivalente zu einem Commit in A haben. Mit anderen Worten, dies listet die + Commits aus git cherry A B auf. Genauer gesagt, --cherry-pick --right-only --no-merges liefert die exakte Liste.

--cherry

Ein Synonym für --right-only --cherry-mark --no-merges; nützlich, um die Ausgabe auf die Commits auf unserer Seite zu beschränken und diejenigen zu markieren, die auf der anderen Seite einer verzweigten Historie angewendet wurden, mit git log --cherry upstream...mybranch, ähnlich wie bei git cherry upstream mybranch.

-g
--walk-reflogs

Anstatt die Commit-Abstammungskette zu durchlaufen, werden die Reflog-Einträge von den neuesten zu den älteren durchlaufen. Wenn diese Option verwendet wird, können keine Commits zum Ausschluss angegeben werden (d.h. die Notationen ^<commit>, <commit1>..<commit2> und <commit1>...<commit2> können nicht verwendet werden).

Mit einem --pretty-Format außer oneline und reference (aus offensichtlichen Gründen) führt dies dazu, dass die Ausgabe zwei zusätzliche Zeilen mit Informationen aus dem Reflog enthält. Der Reflog-Deskriptor in der Ausgabe kann als ref@{<Nth>} (wobei <Nth> der reverse-chronologische Index im Reflog ist) oder als ref@{<timestamp>} (mit dem <timestamp> für diesen Eintrag) angezeigt werden, abhängig von einigen Regeln.

  1. Wenn der Startpunkt als ref@{<Nth>} angegeben ist, wird das Indexformat angezeigt.

  2. Wenn der Startpunkt als ref@{now} angegeben war, wird das Zeitstempelformat angezeigt.

  3. Wenn keiner von beiden verwendet wurde, aber --date auf der Kommandozeile angegeben wurde, wird der Zeitstempel im angeforderten Format von --date angezeigt.

  4. Andernfalls wird das Indexformat angezeigt.

Unter --pretty=oneline wird die Commit-Nachricht mit diesen Informationen auf derselben Zeile vorangestellt. Diese Option kann nicht mit --reverse kombiniert werden. Siehe auch git-reflog[1].

Unter --pretty=reference werden diese Informationen überhaupt nicht angezeigt.

--merge

Zeigt Commits an, die sich mit widersprüchlichen Pfaden im Bereich HEAD...<other> befassen, wobei <other> die erste existierende Pseudoref in MERGE_HEAD, CHERRY_PICK_HEAD, REVERT_HEAD oder REBASE_HEAD ist. Funktioniert nur, wenn der Index ungelöste Einträge aufweist. Diese Option kann verwendet werden, um relevante Commits anzuzeigen, wenn Konflikte aus einem 3-Wege-Merge gelöst werden.

--boundary

Gibt ausgeschlossene Grenzmeldungen aus. Grenzmeldungen werden mit - vorangestellt.

Verlauf vereinfachung

Manchmal interessieren Sie sich nur für Teile des Verlaufs, zum Beispiel die Commits, die einen bestimmten <path> ändern. Aber es gibt zwei Teile der Verlauf vereinfachung, ein Teil ist die Auswahl der Commits und der andere ist die Art und Weise, wie dies geschieht, da es verschiedene Strategien zur Vereinfachung des Verlaufs gibt.

Die folgenden Optionen wählen die anzuzeigenden Commits aus

<paths>

Commits, die die angegebenen <paths> ändern, werden ausgewählt.

--simplify-by-decoration

Commits, die von einem Branch oder Tag referenziert werden, werden ausgewählt.

Beachten Sie, dass zusätzliche Commits angezeigt werden können, um einen aussagekräftigen Verlauf zu erhalten.

Die folgenden Optionen beeinflussen die Art und Weise, wie die Vereinfachung durchgeführt wird

Standard modus

Vereinfacht die Historie zur einfachsten Historie, die den Endzustand des Baums erklärt. Am einfachsten, weil sie einige Nebenäste beschneidet, wenn das Endergebnis dasselbe ist (d. h. Zweige mit demselben Inhalt zusammenführt).

--show-pulls

Schließt alle Commits vom Standardmodus ein, aber auch alle Merge-Commits, die NICHT TREESAME zum ersten Elternteil sind, aber TREESAME zu einem späteren Elternteil sind. Dieser Modus ist hilfreich, um die Merge-Commits anzuzeigen, die eine Änderung "erstmals" in einen Branch "eingeführt" haben.

--full-history

Dasselbe wie der Standardmodus, schneidet jedoch keine Historie ab.

--dense

Nur die ausgewählten Commits werden angezeigt, plus einige, um eine aussagekräftige Historie zu haben.

--sparse

Alle Commits in der vereinfachten Historie werden angezeigt.

--simplify-merges

Zusätzliche Option zu --full-history, um einige unnötige Merges aus der resultierenden Historie zu entfernen, da keine ausgewählten Commits zu diesem Merge beitragen.

--ancestry-path[=<commit>]

Wenn ein Bereich von Commits zum Anzeigen angegeben wird (z. B. <commit1>..<commit2> oder <commit2> ^<commit1>) und ein Commit <commit> in diesem Bereich, werden nur Commits in diesem Bereich angezeigt, die Vorfahren von <commit>, Nachkommen von <commit> oder <commit> selbst sind. Wenn kein Commit angegeben ist, wird <commit1> (der ausgeschlossene Teil des Bereichs) als <commit> verwendet. Kann mehrmals übergeben werden; in diesem Fall wird ein Commit einbezogen, wenn er einer der angegebenen Commits ist oder wenn er ein Vorfahre oder Nachkomme davon ist.

Eine detailliertere Erklärung folgt.

Angenommen, Sie haben foo als <paths> angegeben. Wir nennen Commits, die foo modifizieren, !TREESAME und die übrigen TREESAME. (In einem für foo gefilterten Diff sehen sie unterschiedlich und gleich aus, bzw.)

Im Folgenden werden wir immer denselben Beispielverlauf verwenden, um die Unterschiede zwischen den Vereinfachungseinstellungen zu veranschaulichen. Wir gehen davon aus, dass Sie für eine Datei foo in diesem Commit-Graphen filtern.

	  .-A---M---N---O---P---Q
	 /     /   /   /   /   /
	I     B   C   D   E   Y
	 \   /   /   /   /   /
	  `-------------'   X

Die horizontale Historienlinie A---Q wird als erster Elternteil jedes Merges betrachtet. Die Commits sind:

  • I ist der initiale Commit, in dem foo mit dem Inhalt asdf existiert und eine Datei quux mit dem Inhalt quux existiert. Initiale Commits werden mit einem leeren Baum verglichen, daher ist I !TREESAME.

  • In A enthält foo nur foo.

  • B enthält dieselbe Änderung wie A. Sein Merge M ist trivial und daher TREESAME zu allen Elternteilen.

  • C ändert foo nicht, aber sein Merge N ändert es zu foobar, daher ist es nicht TREESAME zu irgendeinem Elternteil.

  • D setzt foo auf baz. Sein Merge O kombiniert die Zeichenketten von N und D zu foobarbaz; d. h. er ist nicht TREESAME zu irgendeinem Elternteil.

  • E ändert quux zu xyzzy und sein Merge P kombiniert die Zeichenketten zu quux xyzzy. P ist TREESAME zu O, aber nicht zu E.

  • X ist ein unabhängiger Root-Commit, der eine neue Datei side hinzugefügt hat, und Y hat sie modifiziert. Y ist TREESAME zu X. Sein Merge Q fügt side zu P hinzu, und Q ist TREESAME zu P, aber nicht zu Y.

rev-list durchläuft die Historie rückwärts und schließt Commits ein oder schließt sie aus, je nachdem, ob --full-history und/oder Elternteil-Rewriting (über --parents oder --children) verwendet werden. Die folgenden Einstellungen sind verfügbar.

Standard modus

Commits werden einbezogen, wenn sie NICHT TREESAME zu irgendeinem Elternteil sind (obwohl dies geändert werden kann, siehe --sparse unten). Wenn der Commit ein Merge war und er TREESAME zu einem Elternteil war, folgen Sie nur diesem Elternteil. (Auch wenn es mehrere TREESAME-Elternteile gibt, folgen Sie nur einem davon.) Andernfalls folgen Sie allen Elternteilen.

Dies führt zu

	  .-A---N---O
	 /     /   /
	I---------D

Beachten Sie, wie die Regel, nur dem TREESAME-Elternteil zu folgen, falls einer verfügbar ist, B vollständig aus der Betrachtung entfernt hat. C wurde über N berücksichtigt, ist aber TREESAME. Root-Commits werden mit einem leeren Baum verglichen, daher ist I !TREESAME.

Eltern-/Kind-Beziehungen sind nur mit --parents sichtbar, aber das beeinflusst nicht die im Standardmodus ausgewählten Commits, daher haben wir die Elternlinien gezeigt.

--full-history ohne Umschreiben der Eltern-Commits

Dieser Modus unterscheidet sich vom Standard in einem Punkt: Folgen Sie immer allen Elternteilen eines Merges, auch wenn er TREESAME zu einem davon ist. Selbst wenn mehr als eine Seite des Merges Commits enthält, die einbezogen werden, bedeutet dies nicht, dass der Merge selbst einbezogen wird! Im Beispiel erhalten wir

	I  A  B  N  D  O  P  Q

M wurde ausgeschlossen, weil er TREESAME zu beiden Elternteilen ist. E, C und B wurden alle durchlaufen, aber nur B war !TREESAME, daher erscheinen die anderen nicht.

Beachten Sie, dass es ohne Elternteil-Rewriting nicht wirklich möglich ist, über die Eltern-/Kind-Beziehungen zwischen den Commits zu sprechen, daher zeigen wir sie getrennt.

--full-history mit Umschreiben der Eltern-Commits

Gewöhnliche Commits werden nur dann einbezogen, wenn sie !TREESAME sind (obwohl dies geändert werden kann, siehe --sparse unten).

Merges werden immer einbezogen. Ihre Elternliste wird jedoch neu geschrieben: Entlang jedes Elternteils werden Commits, die selbst nicht einbezogen werden, entfernt. Dies führt zu

	  .-A---M---N---O---P---Q
	 /     /   /   /   /
	I     B   /   D   /
	 \   /   /   /   /
	  `-------------'

Vergleichen Sie mit --full-history ohne Rewriting oben. Beachten Sie, dass E entfernt wurde, weil es TREESAME ist, aber die Elternliste von P wurde so neu geschrieben, dass sie Es Elternteil I enthält. Dasselbe geschah für C und N sowie für X, Y und Q.

Zusätzlich zu den obigen Einstellungen können Sie ändern, ob TREESAME die Einbeziehung beeinflusst.

--dense

Durchlaufene Commits werden einbezogen, wenn sie NICHT TREESAME zu irgendeinem Elternteil sind.

--sparse

Alle durchlaufenen Commits werden einbezogen.

Beachten Sie, dass dies ohne --full-history immer noch Merges vereinfacht: Wenn einer der Elternteile TREESAME ist, folgen wir nur diesem, sodass die anderen Seiten des Merges niemals durchlaufen werden.

--simplify-merges

Bauen Sie zuerst einen Historien-Graphen auf, auf die gleiche Weise, wie --full-history mit Elternteil-Rewriting es tut (siehe oben).

Vereinfachen Sie dann jeden Commit C zu seinem Ersatz C' in der endgültigen Historie gemäß den folgenden Regeln:

  • Setzen Sie C' auf C.

  • Ersetzen Sie jeden Elternteil P von C' durch seine Vereinfachung P'. Dabei werden Elternteile, die Vorfahren anderer Elternteile sind oder die Root-Commits sind, die TREESAME zu einem leeren Baum sind, verworfen und Duplikate entfernt, aber darauf geachtet, nie alle Elternteile zu verwerfen, zu denen wir TREESAME sind.

  • Wenn nach diesem Elternteil-Rewriting C' ein Root- oder Merge-Commit ist (null oder mehr als 1 Elternteil hat), ein Rand-Commit ist oder !TREESAME ist, bleibt er bestehen. Andernfalls wird er durch seinen einzigen Elternteil ersetzt.

Die Auswirkung hiervon wird am besten durch den Vergleich mit --full-history mit Elternteil-Rewriting gezeigt. Das Beispiel wird zu

	  .-A---M---N---O
	 /     /       /
	I     B       D
	 \   /       /
	  `---------'

Beachten Sie die wesentlichen Unterschiede bei N, P und Q im Vergleich zu --full-history.

  • Ns Elternliste enthielt I, das entfernt wurde, da es ein Vorfahre des anderen Elternteils M ist. Dennoch blieb N bestehen, da es !TREESAME ist.

  • Ps Elternliste hatte ebenfalls I, das entfernt wurde. P wurde dann vollständig entfernt, da es einen Elternteil hatte und TREESAME war.

  • Qs Elternliste hatte Y vereinfacht zu X. X wurde dann entfernt, da es ein TREESAME-Root war. Q wurde dann vollständig entfernt, da es einen Elternteil hatte und TREESAME war.

Es gibt einen weiteren verfügbaren Vereinfachungsmodus.

--ancestry-path[=<commit>]

Beschränkt die angezeigten Commits auf solche, die Vorfahren von <commit> sind, oder die Nachkommen von <commit> sind, oder <commit> selbst sind.

Betrachten wir als Beispiel für die Anwendung die folgende Commit-Historie.

	    D---E-------F
	   /     \       \
	  B---C---G---H---I---J
	 /                     \
	A-------K---------------L--M

Ein normales D..M berechnet die Menge der Commits, die Vorfahren von M sind, schließt aber die aus, die Vorfahren von D sind. Dies ist nützlich, um zu sehen, was mit der Historie geschehen ist, die zu M führt, seit D existiert, im Sinne von "was hat M, das in D nicht existierte?". Das Ergebnis in diesem Beispiel wären alle Commits, außer A und B (und natürlich D selbst).

Wenn wir herausfinden wollen, welche Commits in M mit dem von D eingeführten Fehler kontaminiert sind und behoben werden müssen, möchten wir vielleicht nur die Teilmenge von D..M betrachten, die tatsächlich Nachkommen von D sind, d.h. C und K ausschließen. Genau das leistet die Option --ancestry-path. Angenommen auf den Bereich D..M, führt dies zu

		E-------F
		 \       \
		  G---H---I---J
			       \
				L--M

Wir können auch --ancestry-path=D anstelle von --ancestry-path verwenden, was im Kontext des Bereichs D..M dasselbe bedeutet, aber nur expliziter ist.

Wenn wir stattdessen an einem bestimmten Thema innerhalb dieses Bereichs und allen davon betroffenen Commits interessiert sind, möchten wir vielleicht nur die Teilmenge von D..M betrachten, die dieses Thema in ihrem Vorfahrenpfad enthalten. So würde zum Beispiel die Verwendung von --ancestry-path=H D..M zu

		E
		 \
	      C---G---H---I---J
			       \
				L--M

während --ancestry-path=K D..M zu

		K---------------L--M

Bevor wir eine weitere Option, --show-pulls, besprechen, müssen wir ein neues Beispiel-Historie erstellen.

Ein häufiges Problem, mit dem Benutzer konfrontiert sind, wenn sie sich eine vereinfachte Historie ansehen, ist, dass ein Commit, von dem sie wissen, dass er eine Datei irgendwie geändert hat, in der vereinfachten Historie dieser Datei nicht erscheint. Lassen Sie uns ein neues Beispiel demonstrieren und zeigen, wie Optionen wie --full-history und --simplify-merges in diesem Fall funktionieren.

	  .-A---M-----C--N---O---P
	 /     / \  \  \/   /   /
	I     B   \  R-'`-Z'   /
	 \   /     \/         /
	  \ /      /\        /
	   `---X--'  `---Y--'

Angenommen, ich habe file.txt erstellt, das von A, B und X auf verschiedene Arten modifiziert wurde. Die Single-Parent-Commits C, Z und Y ändern file.txt nicht. Der Merge-Commit M wurde durch Auflösung eines Merge-Konflikts erstellt, um beide Änderungen von A und B einzuschließen und ist daher weder mit dem einen noch mit dem anderen TREESAME. Der Merge-Commit R wurde jedoch erstellt, indem der Inhalt von file.txt bei M ignoriert und nur der Inhalt von file.txt bei X übernommen wurde. Daher ist R TREESAME zu X, aber nicht zu M. Schließlich ist die natürliche Merge-Auflösung zur Erstellung von N die Übernahme des Inhalts von file.txt bei R, sodass N TREESAME zu R, aber nicht zu C ist. Die Merge-Commits O und P sind TREESAME zu ihren ersten Eltern, aber nicht zu ihren zweiten Eltern Z bzw. Y.

Bei Verwendung des Standardmodus haben sowohl N als auch R einen TREESAME-Elternteil, daher werden diese Kanten durchlaufen und die anderen ignoriert. Der resultierende Historien-Graph ist

	I---X

Bei Verwendung von --full-history durchläuft Git jede Kante. Dies wird die Commits A und B sowie den Merge M aufdecken, wird aber auch die Merge-Commits O und P enthüllen. Mit Elternteil-Rewriting ist der resultierende Graph

	  .-A---M--------N---O---P
	 /     / \  \  \/   /   /
	I     B   \  R-'`--'   /
	 \   /     \/         /
	  \ /      /\        /
	   `---X--'  `------'

Hier tragen die Merge-Commits O und P zusätzlichen Lärm, da sie tatsächlich keine Änderung an file.txt vorgenommen haben. Sie haben nur ein Thema gemerged, das auf einer älteren Version von file.txt basierte. Dies ist ein häufiges Problem in Repositories, die einen Workflow verwenden, bei dem viele Mitwirkende parallel arbeiten und ihre Topic-Branches entlang eines einzelnen Stammes zusammenführen: Viele nicht zusammenhängende Merges erscheinen in den Ergebnissen von --full-history.

Bei Verwendung der Option --simplify-merges verschwinden die Commits O und P aus den Ergebnissen. Dies liegt daran, dass die neu geschriebenen zweiten Elternteile von O und P von ihren ersten Elternteilen erreichbar sind. Diese Kanten werden entfernt und dann sehen die Commits wie Single-Parent-Commits aus, die TREESAME zu ihrem Elternteil sind. Dies geschieht auch mit dem Commit N, was zu einer Historienansicht wie folgt führt:

	  .-A---M--.
	 /     /    \
	I     B      R
	 \   /      /
	  \ /      /
	   `---X--'

In dieser Ansicht sehen wir alle wichtigen Single-Parent-Änderungen von A, B und X. Wir sehen auch den sorgfältig aufgelösten Merge M und den nicht so sorgfältig aufgelösten Merge R. Dies ist normalerweise ausreichend, um zu bestimmen, warum die Commits A und B in der Standardansicht aus der Historie "verschwunden" sind. Es gibt jedoch einige Probleme mit diesem Ansatz.

Das erste Problem ist die Leistung. Im Gegensatz zu jeder früheren Option erfordert die Option --simplify-merges das Durchlaufen der gesamten Commit-Historie, bevor ein einzelnes Ergebnis zurückgegeben wird. Dies kann die Option für sehr große Repositories schwierig zu verwenden machen.

Das zweite Problem ist die Prüfung. Wenn viele Mitwirkende am selben Repository arbeiten, ist es wichtig, welche Merge-Commits eine Änderung in einen wichtigen Branch eingeführt haben. Der problematische Merge R oben ist wahrscheinlich nicht der Merge-Commit, der verwendet wurde, um in einen wichtigen Branch zu mergen. Stattdessen wurde der Merge N verwendet, um R und X in den wichtigen Branch zu mergen. Dieser Commit kann Informationen darüber enthalten, warum die Änderung X die Änderungen von A und B in seiner Commit-Nachricht überschrieben hat.

--show-pulls

Zusätzlich zu den im Standardverlauf angezeigten Commits werden alle Merge-Commits angezeigt, die nicht TREESAME zu ihrem ersten Elternteil sind, aber TREESAME zu einem späteren Elternteil sind.

Wenn ein Merge-Commit von --show-pulls einbezogen wird, wird der Merge so behandelt, als ob er die Änderung von einem anderen Branch "gezogen" hätte. Wenn --show-pulls auf dieses Beispiel angewendet wird (und keine anderen Optionen), ist der resultierende Graph

	I---X---R---N

Hier werden die Merge-Commits R und N einbezogen, da sie die Commits X bzw. R in den Basis-Branch "gezogen" haben. Diese Merges sind der Grund dafür, dass die Commits A und B nicht im Standardverlauf erscheinen.

Wenn --show-pulls mit --simplify-merges kombiniert wird, enthält der Graph alle notwendigen Informationen.

	  .-A---M--.   N
	 /     /    \ /
	I     B      R
	 \   /      /
	  \ /      /
	   `---X--'

Beachten Sie, dass, da M von R erreichbar ist, die Kante von N nach M vereinfacht wurde. N erscheint jedoch immer noch in der Historie als wichtiger Commit, da er die Änderung R in den Haupt-Branch "gezogen" hat.

Die Option --simplify-by-decoration ermöglicht es Ihnen, nur die Gesamtübersicht über die Topologie der Historie anzuzeigen, indem Commits weggelassen werden, die nicht von Tags referenziert werden. Commits werden als !TREESAME markiert (mit anderen Worten, nach den oben beschriebenen Historienvereinfachungsregeln beibehalten), wenn (1) sie von Tags referenziert werden oder (2) sie den Inhalt der auf der Befehlszeile angegebenen Pfade ändern. Alle anderen Commits werden als TREESAME markiert (können also vereinfacht wegfallen).

Commit-Reihenfolge

Standardmäßig werden die Commits in umgekehrt chronologischer Reihenfolge angezeigt.

--date-order

Zeigt keine Eltern an, bevor alle ihre Kinder angezeigt wurden, zeigt aber ansonsten Commits in der Reihenfolge der Commit-Zeitstempel an.

--author-date-order

Zeigt keine Eltern an, bevor alle ihre Kinder angezeigt wurden, zeigt aber ansonsten Commits in der Reihenfolge der Autoren-Zeitstempel an.

--topo-order

Zeigt keine Eltern an, bevor alle ihre Kinder angezeigt wurden, und vermeidet die Anzeige von Commits aus mehreren parallelen Verzweigungen vermischt.

Zum Beispiel in einer Commit-Historie wie dieser

    ---1----2----4----7
	\	       \
	 3----5----6----8---

wobei die Zahlen die Reihenfolge der Commit-Zeitstempel bezeichnen, zeigt git rev-list und ähnliche Befehle mit --date-order die Commits in der Zeitstempelreihenfolge an: 8 7 6 5 4 3 2 1.

Mit --topo-order würden sie 8 6 5 3 7 4 2 1 (oder 8 7 4 2 6 5 3 1) anzeigen; einige ältere Commits werden vor neueren angezeigt, um die Anzeige von Commits aus zwei parallelen Entwicklungssträngen gemischt zu vermeiden.

--reverse

Gibt die ausgewählten Commits (siehe Abschnitt Commit-Begrenzung oben) in umgekehrter Reihenfolge aus. Kann nicht mit --walk-reflogs kombiniert werden.

Objekt-Traversierung

Diese Optionen sind hauptsächlich für das Packen von Git-Repositories gedacht.

--no-walk[=(sorted|unsorted)]

Zeigt nur die angegebenen Commits an, durchläuft aber nicht ihre Vorgänger. Dies hat keine Auswirkung, wenn ein Bereich angegeben ist. Wenn das Argument unsorted angegeben wird, werden die Commits in der Reihenfolge angezeigt, in der sie auf der Kommandozeile eingegeben wurden. Andernfalls (wenn sorted oder kein Argument angegeben wurde) werden die Commits in umgekehrt chronologischer Reihenfolge nach dem Commit-Zeitpunkt angezeigt. Kann nicht mit --graph kombiniert werden.

--do-walk

Überschreibt ein vorheriges --no-walk.

Commit-Formatierung

--pretty[=<format>]
--format=<format>

Gibt den Inhalt der Commit-Logs in einem bestimmten Format aus. <Format> kann eine der folgenden Optionen sein: oneline, short, medium, full, fuller, reference, email, raw, format:<Zeichenkette> und tformat:<Zeichenkette>. Wenn <Format> keine der oben genannten ist und ein %<Platzhalter> enthält, verhält es sich, als ob --pretty=tformat:<Format> angegeben worden wäre.

Siehe den Abschnitt "PRETTY FORMATS" für zusätzliche Details zu jedem Format. Wenn der Teil =<Format> weggelassen wird, wird standardmäßig medium verwendet.

Hinweis
Sie können das Standard-Schönheitsformat in der Repository-Konfiguration festlegen (siehe git-config[1]).
--abbrev-commit

Anstatt den vollständigen 40-stelligen hexadezimalen Commit-Objektnamen anzuzeigen, wird ein Präfix angezeigt, das das Objekt eindeutig benennt. Die Option --abbrev=<n> (die auch die Diff-Ausgabe beeinflusst, wenn sie angezeigt wird) kann verwendet werden, um die Mindestlänge des Präfixes festzulegen.

Dies sollte --pretty=oneline für Benutzer mit 80-stelligen Terminals wesentlich lesbarer machen.

--no-abbrev-commit

Zeigt den vollständigen 40-stelligen hexadezimalen Commit-Objektnamen an. Dies negiert --abbrev-commit, sei es explizit oder impliziert durch andere Optionen wie --oneline. Es überschreibt auch die Variable log.abbrevCommit.

--oneline

Dies ist eine Kurzform für die gemeinsame Verwendung von --pretty=oneline --abbrev-commit.

--encoding=<encoding>

Commit-Objekte speichern die Zeichenkodierung, die für die Log-Nachricht in ihrem Encoding-Header verwendet wurde. Diese Option kann verwendet werden, um den Befehl anzuweisen, die Commit-Log-Nachricht in die vom Benutzer bevorzugte Kodierung zu konvertieren. Für Nicht-Plumbing-Befehle ist dies standardmäßig UTF-8. Beachten Sie, dass, wenn ein Objekt als in X kodiert beansprucht wird und wir in X ausgeben, wir das Objekt unverändert ausgeben. Das bedeutet, dass ungültige Sequenzen im Original-Commit in die Ausgabe kopiert werden können. Ebenso, wenn iconv(3) die Konvertierung des Commits fehlschlägt, geben wir das Original-Objekt unverändert aus.

--expand-tabs=<n>
--expand-tabs
--no-expand-tabs

Führt eine Tabulatorerweiterung durch (ersetzt jeden Tabulator durch genügend Leerzeichen, um zur nächsten Spalte zu gelangen, die ein Vielfaches von <n> ist) in der Log-Nachricht, bevor sie in der Ausgabe angezeigt wird. --expand-tabs ist eine Kurzform für --expand-tabs=8 und --no-expand-tabs ist eine Kurzform für --expand-tabs=0, was die Tabulatorerweiterung deaktiviert.

Standardmäßig werden Tabs in Schönheitsformaten erweitert, die die Log-Nachricht um 4 Leerzeichen einrücken (d.h. medium, was die Standardeinstellung ist, full und fuller).

--notes[=<ref>]

Zeigt die Notizen (siehe git-notes[1]) an, die den Commit kommentieren, wenn die Commit-Log-Nachricht angezeigt wird. Dies ist die Standardeinstellung für die Befehle git log, git show und git whatchanged, wenn keine Option --pretty, --format oder --oneline auf der Befehlszeile angegeben ist.

Standardmäßig stammen die angezeigten Notizen aus den Notiz-Refs, die in den Variablen core.notesRef und notes.displayRef aufgeführt sind (oder entsprechende Umgebungsvariablen). Weitere Einzelheiten finden Sie in git-config[1].

Mit einem optionalen Argument <Ref> wird der Ref verwendet, um die anzuzeigenden Notizen zu finden. Der Ref kann den vollständigen Ref-Namen angeben, wenn er mit refs/notes/ beginnt; wenn er mit notes/ beginnt, werden refs/ und andernfalls refs/notes/ vorangestellt, um den vollständigen Namen des Refs zu bilden.

Mehrere Optionen --notes können kombiniert werden, um zu steuern, welche Notizen angezeigt werden. Beispiele: "--notes=foo" zeigt nur Notizen aus refs/notes/foo an; "--notes=foo --notes" zeigt sowohl Notizen aus "refs/notes/foo" als auch aus dem/den Standard-Notiz-Ref(s) an.

--no-notes

Zeigt keine Notizen an. Dies negiert die obige Option --notes, indem die Liste der Notiz-Refs zurückgesetzt wird, aus denen Notizen angezeigt werden. Optionen werden in der Reihenfolge ihrer Angabe auf der Befehlszeile geparst, sodass z. B. "--notes --notes=foo --no-notes --notes=bar" nur Notizen aus refs/notes/bar anzeigt.

--show-notes-by-default

Zeigt die Standardnotizen an, es sei denn, es werden Optionen zur Anzeige spezifischer Notizen angegeben.

--show-notes[=<ref>]
--standard-notes
--no-standard-notes

Diese Optionen sind veraltet. Verwenden Sie stattdessen die obigen Optionen --notes/--no-notes.

--show-signature

Überprüft die Gültigkeit eines signierten Commit-Objekts, indem die Signatur an gpg --verify übergeben und die Ausgabe angezeigt wird.

--relative-date

Synonym für --date=relative.

--date=<format>

Wirkt sich nur auf in menschenlesbarer Form angezeigte Daten aus, z. B. bei Verwendung von --pretty. Die Konfigurationsvariable log.date setzt einen Standardwert für die Option --date des Befehls log. Standardmäßig werden Daten in der ursprünglichen Zeitzone (entweder des Committer oder des Autors) angezeigt. Wenn -local an das Format angehängt wird (z. B. iso-local), wird stattdessen die lokale Zeitzone des Benutzers verwendet.

--date=relative zeigt Daten relativ zur aktuellen Zeit an, z. B. "vor 2 Stunden". Die Option -local hat keine Auswirkung für --date=relative.

--date=local ist ein Alias für --date=default-local.

--date=iso (oder --date=iso8601) zeigt Zeitstempel in einem ISO 8601-ähnlichen Format an. Die Unterschiede zum strikten ISO 8601-Format sind

  • ein Leerzeichen anstelle des Trennzeichens T für Datum/Uhrzeit

  • ein Leerzeichen zwischen Uhrzeit und Zeitzone

  • kein Doppelpunkt zwischen Stunden und Minuten der Zeitzone

--date=iso-strict (oder --date=iso8601-strict) zeigt Zeitstempel im strikten ISO 8601-Format an.

--date=rfc (oder --date=rfc2822) zeigt Zeitstempel im RFC 2822-Format an, das häufig in E-Mail-Nachrichten vorkommt.

--date=short zeigt nur das Datum, aber nicht die Uhrzeit, im Format JJJJ-MM-TT an.

--date=raw zeigt das Datum als Sekunden seit der Epoche (1970-01-01 00:00:00 UTC) an, gefolgt von einem Leerzeichen, und dann die Zeitzone als Offset von UTC (ein + oder - mit vier Ziffern; die ersten beiden sind Stunden, die zweiten beiden Minuten). D.h., als ob der Zeitstempel mit strftime("%s %z") formatiert wäre. Beachten Sie, dass die Option -local den Wert Sekunden seit der Epoche (der immer in UTC gemessen wird) nicht beeinflusst, aber den begleitenden Zeitzonenwert umschaltet.

--date=human zeigt die Zeitzone an, wenn die Zeitzone nicht mit der aktuellen Zeitzone übereinstimmt, und gibt nicht das gesamte Datum aus, wenn dieses übereinstimmt (d.h., überspringt die Ausgabe des Jahres für Daten, die "dieses Jahr" sind, überspringt aber auch das gesamte Datum selbst, wenn es in den letzten Tagen liegt und wir nur den Wochentag angeben können). Bei älteren Daten werden auch die Stunde und Minute weggelassen.

--date=unix zeigt das Datum als Unix-Epochen-Zeitstempel (Sekunden seit 1970) an. Wie bei --raw ist dies immer in UTC und daher hat -local keine Auswirkung.

--date=format:<format> übergibt das <format> an die strftime Ihres Systems, außer für %s, %z und %Z, die intern behandelt werden. Verwenden Sie --date=format:%c, um das Datum im bevorzugten Format der System-Locale anzuzeigen. Eine vollständige Liste der Formatplatzhalter finden Sie im Handbuch strftime(3). Bei Verwendung von -local ist die korrekte Syntax --date=format-local:<format>.

--date=default ist das Standardformat und basiert auf der Ausgabe von ctime(3). Es zeigt eine einzelne Zeile mit dem dreibuchstabigen Wochentag, dem dreibuchstabigen Monat, dem Tag des Monats, der Stunde-Minute-Sekunde im Format "HH:MM:SS", gefolgt vom 4-stelligen Jahr, plus Zeitzoneninformationen, es sei denn, die lokale Zeitzone wird verwendet, z.B. Do Jan 1 00:00:00 1970 +0000.

--parents

Gibt auch die Eltern des Commits aus (in der Form "commit parent…​"). Aktiviert auch die Umwandlung von Eltern, siehe History Simplification oben.

--children

Gibt auch die Kinder des Commits aus (in der Form "commit child…​"). Aktiviert auch die Umwandlung von Eltern, siehe History Simplification oben.

--left-right

Markiert, von welcher Seite einer symmetrischen Differenz ein Commit erreichbar ist. Commits von der linken Seite werden mit einem Präfix < versehen, und die von der rechten Seite mit >. Wenn dies mit --boundary kombiniert wird, werden diese Commits mit - präfixiert.

Zum Beispiel, wenn Sie diese Topologie haben

	     y---b---b  branch B
	    / \ /
	   /   .
	  /   / \
	 o---x---a---a  branch A

würde eine Ausgabe wie diese erfolgen

	$ git rev-list --left-right --boundary --pretty=oneline A...B

	>bbbbbbb... 3rd on b
	>bbbbbbb... 2nd on b
	<aaaaaaa... 3rd on a
	<aaaaaaa... 2nd on a
	-yyyyyyy... 1st on b
	-xxxxxxx... 1st on a
--graph

Zeichnet eine textbasierte grafische Darstellung der Commit-Historie auf der linken Seite der Ausgabe. Dies kann dazu führen, dass zusätzliche Zeilen zwischen den Commits gedruckt werden, damit die Graphhistorie korrekt gezeichnet werden kann. Kann nicht mit --no-walk kombiniert werden.

Dies aktiviert die Umwandlung von Eltern, siehe History Simplification oben.

Dies aktiviert standardmäßig die Option --topo-order, aber die Option --date-order kann ebenfalls angegeben werden.

--show-linear-break[=<barrier>]

Wenn --graph nicht verwendet wird, werden alle Historienzweige abgeflacht, was es schwierig machen kann zu erkennen, dass zwei aufeinanderfolgende Commits nicht zu einem linearen Zweig gehören. Diese Option setzt in diesem Fall eine Barriere zwischen ihnen. Wenn <barrier> angegeben wird, ist dies der String, der anstelle des Standardstrings angezeigt wird.

AUSGABE

Wenn keine Konflikte auftreten, ist die Ausgabe dieses Befehls als Eingabe für git update-ref --stdin verwendbar. Sie hat das Format

update refs/heads/branch1 ${NEW_branch1_HASH} ${OLD_branch1_HASH}
update refs/heads/branch2 ${NEW_branch2_HASH} ${OLD_branch2_HASH}
update refs/heads/branch3 ${NEW_branch3_HASH} ${OLD_branch3_HASH}

wobei die Anzahl der aktualisierten Refs von den übergebenen Argumenten und der Form der neu abzuspielenden Historie abhängt. Bei Verwendung von --advance ist die Anzahl der aktualisierten Refs immer eins, aber für --onto kann sie eins oder mehr sein (das gleichzeitige Rebasing mehrerer Branches wird unterstützt).

BEENDIGUNGSSTATUS

Für ein erfolgreiches Replay ohne Konflikte ist der Exit-Status 0. Wenn das Replay Konflikte aufweist, ist der Exit-Status 1. Wenn das Replay aufgrund eines Fehlers nicht abgeschlossen werden kann (oder nicht gestartet werden kann), ist der Exit-Status etwas anderes als 0 oder 1.

BEISPIELE

Um einfach mybranch auf target zu rebasen

$ git replay --onto target origin/main..mybranch
update refs/heads/mybranch ${NEW_mybranch_HASH} ${OLD_mybranch_HASH}

Um die Commits von mybranch auf target zu cherry-picken

$ git replay --advance target origin/main..mybranch
update refs/heads/target ${NEW_target_HASH} ${OLD_target_HASH}

Beachten Sie, dass die ersten beiden Beispiele exakt dieselben Commits auf exakt dieselbe neue Basis rebasen. Sie unterscheiden sich nur darin, dass das erste Beispiel Anweisungen zur Aktualisierung von mybranch auf die neuen Commits liefert und das zweite Anweisungen zur Aktualisierung von target auf diese liefert.

Was tun, wenn Sie einen Stapel von Branches haben, die voneinander abhängen, und Sie den gesamten Satz wirklich rebasen möchten?

$ git replay --contained --onto origin/main origin/main..tipbranch
update refs/heads/branch1 ${NEW_branch1_HASH} ${OLD_branch1_HASH}
update refs/heads/branch2 ${NEW_branch2_HASH} ${OLD_branch2_HASH}
update refs/heads/tipbranch ${NEW_tipbranch_HASH} ${OLD_tipbranch_HASH}

Beim Aufruf von git replay muss man keinen Bereich von Commits zum Abspielen mit der Syntax A..B angeben; jeder Bereichsausdruck ist gültig

$ git replay --onto origin/main ^base branch1 branch2 branch3
update refs/heads/branch1 ${NEW_branch1_HASH} ${OLD_branch1_HASH}
update refs/heads/branch2 ${NEW_branch2_HASH} ${OLD_branch2_HASH}
update refs/heads/branch3 ${NEW_branch3_HASH} ${OLD_branch3_HASH}

Dies rebased gleichzeitig branch1, branch2 und branch3, alle Commits, die sie seit base haben, und spielt sie auf origin/main auf. Diese drei Branches können Commits auf base haben, die sie gemeinsam haben, aber das muss nicht der Fall sein.

GIT

Teil der git[1] Suite