Themenlösung
Der richtige Befehl zur Beantwortung der gestellten Frage kann einer der folgenden sein (vorausgesetzt, der Zweig topic
ist bereits ausgecheckt):
git rebase --onto B master
git rebase --onto master~1 master
git rebase --onto B A
git rebase --onto B C
git rebase --onto B
Wenn topic
nicht ausgecheckt, fügen Sie einfach topic
den Befehl (mit Ausnahme des letzten) wie folgt hinzu :
git rebase --onto B master topic
Alternativ können Sie zuerst die Filiale überprüfen mit:
git checkout topic
Stellen Sie eine beliebige Zeichenfolge von Commits auf ein Ziel-Commit um
Die Grundform des Befehls, den wir benötigen und der aus der Dokumentation hervorgeht, lautet:
git rebase --onto <Target> [<Upstream> [<Branch>]]
<Branch>
ist optional und überprüft lediglich den angegebenen Zweig, bevor der Rest des Befehls ausgeführt wird. Wenn Sie den Zweig, den Sie neu aufbauen möchten, bereits ausgecheckt haben, benötigen Sie diesen nicht. Beachten Sie, dass Sie angegeben haben müssen, <Upstream>
um anzugeben, <Branch>
oder git denkt, dass Sie angeben<Upstream>
.
<Target>
ist das Commit, an das wir unsere Reihe von Commits anhängen werden. Wenn Sie einen Zweigstellennamen angeben, geben Sie einfach das Head Commit dieses Zweigs an. <Target>
kann ein beliebiges Commit sein, das nicht in der Zeichenfolge der zu verschiebenden Commits enthalten ist. Beispielsweise:
A --- B --- C --- D master
\
\-- X --- Y --- Z feature
Um den gesamten Funktionszweig zu verschieben, können Sie nicht wählen X
, Y
, Z
oder feature
wie die<Target>
da alle sind verpflichtet innerhalb der Gruppe bewegt werden.
<Upstream>
ist etwas Besonderes, weil es zwei verschiedene Dinge bedeuten kann. Wenn es sich um ein Commit handelt, das ein Vorfahr des ausgecheckten Zweigs ist, dient es als Schnittpunkt. In dem Beispiel, das ich bereitgestellt habe, wäre dies alles, was nicht C
ist D
, oder master
. Alle Commits danach, <Upstream>
bis der Kopf des ausgecheckten Zweigs verschoben wird.
Wenn <Upstream>
es sich jedoch nicht um einen Vorfahren handelt, sichert git die Kette vom angegebenen Commit, bis ein gemeinsamer Vorfahr mit dem ausgecheckten Zweig gefunden wird (und bricht ab, wenn er keinen findet). In unserem Fall ein <Upstream>
von B
, C
, D
oder master
werden alle begehen B
als der Schnittpunkt dient. <Upstream>
ist selbst ein optionaler Befehl, und wenn er nicht angegeben ist, betrachtet git das übergeordnete Element des ausgecheckten Zweigs, was der Eingabe entspricht master
.
Nachdem git die Commits ausgewählt hat, die geschnitten und verschoben werden sollen, werden sie angewendet <Target>
, um alle Commits zu überspringen, die bereits auf das Ziel angewendet wurden.
Interessante Beispiele und Ergebnisse
Verwenden Sie diesen Ausgangspunkt:
A --- B --- C --- D --- E master
\
\-- X --- Y --- Z feature
git rebase --onto D A feature
Gelten Commits B
, C
, X
, Y
, Z
zu begehen D
und das Überspringen am Ende B
und C
weil sie bereits angewendet wurden.
git rebase --onto C X feature
Wendet Commits an Y
und Z
legt fest C
, wobei Commit effektiv gelöscht wirdX
git checkout B
vor dem Laufen versuchtgit rebase
?