tl; dr
Die richtige Syntax, die zusätzlich B
zur A
Verwendung git rebase --onto
in Ihrem Fall neu erstellt werden muss, lautet:
git checkout B
git rebase --onto A B^
oder Rebase zusätzlich B
zu A
dem Commit, das das übergeordnete Element von ist, auf dasB
mit B^
oder verwiesen wird B~1
.
Wenn Sie sich für den Unterschied interessieren git rebase <branch>
und git rebase --onto <branch>
weiterlesen.
Die Quick: Git Rebase
git rebase <branch>
wird den Zweig, auf den Sie gerade ausgecheckt haben und auf den verwiesen wird HEAD
, zusätzlich zu dem letzten Commit, das von, <branch>
aber nicht von erreichbar ist, neu starten HEAD
.
Dies ist der häufigste Fall einer Neugründung und wahrscheinlich derjenige, der weniger Planung im Voraus erfordert.
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E (HEAD) D---E (HEAD)
In diesem Beispiel F
und G
sind verpflichtet , die von erreichbar ist , branch
aber nicht aus HEAD
. Das Sprichwort git rebase branch
nimmt D
, das ist das erste Commit nach dem Verzweigungspunkt, und setzt es neu (dh ändert sein übergeordnetes Element ) auf das letzte Commit, das von, branch
aber nicht von erreichbar HEAD
ist G
.
The Precise: git rebase --onto mit 2 Argumenten
git rebase --onto
Ermöglicht das erneute Basieren ab einem bestimmten Commit . Sie erhalten die genaue Kontrolle darüber, was und wo neu basiert wird. Dies ist für Szenarien gedacht, in denen Sie präzise sein müssen.
Stellen wir uns zum Beispiel vor, wir müssen HEAD
genau auf der Grundlage von neu F
starten E
. Wir sind nur daran interessiert, F
in unsere Arbeitsbranche zu kommen, während wir gleichzeitig nicht behalten möchten, D
weil sie einige inkompatible Änderungen enthält.
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E---H---I (HEAD) E---H---I (HEAD)
In diesem Fall würden wir sagen git rebase --onto F D
. Das heisst:
Rebase die aus erreichbar begehen , HEAD
deren Stamm D
auf der Oberseite F
.
Mit anderen Worten, ändern Sie das übergeordnete Element von E
von D
nach F
. Die Syntax von git rebase --onto
ist dann git rebase --onto <newparent> <oldparent>
.
Ein weiteres Szenario, in dem dies nützlich ist, besteht darin, dass Sie einige Commits schnell aus dem aktuellen Zweig entfernen möchten, ohne eine interaktive Rebase durchführen zu müssen :
Before After
A---B---C---E---F (HEAD) A---B---F (HEAD)
In diesem Beispiel würden Sie sagen , um zu entfernen C
und E
aus der Sequenz zu entfernen git rebase --onto B E
, oder HEAD
auf der Stelle, B
an der sich der alte Elternteil befand , neu zu gründen E
.
Der Chirurg: Git Rebase - mit 3 Argumenten
git rebase --onto
kann in Bezug auf Präzision noch einen Schritt weiter gehen. Tatsächlich können Sie einen beliebigen Bereich von Commits auf einen anderen zurücksetzen .
Hier ist ein Beispiel:
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E---H---I (HEAD) E---H (HEAD)
In diesem Fall möchten wir den genauen Bereich E---H
über dem Basiswert neu festlegen F
und dabei ignorieren, auf welche Stelle HEAD
gerade verwiesen wird. Wir können das tun, indem wir sagen git rebase --onto F D H
, was bedeutet:
Rebase den Bereich von Commits , dessen Stamm D
bis zu H
oben auf F
.
Die Syntax von git rebase --onto
mit einer Reihe von Commits wird dann git rebase --onto <newparent> <oldparent> <until>
. Der Trick hier ist die Erinnerung , dass die von referenzierten Festschreibung <until>
ist inbegriffen im Bereich und wird die neu worden , HEAD
nachdem das Fütterungsmaterial abgeschlossen ist.