Ich habe einen Baum wie diesen:
(commit 1) - master
\-- (commit 2) - (commit 3) - demo
\-- (commit 4) - (commit 5) - PRO
und ich muss den PRO-Zweig zum Master verschieben
(commit 1) - master
|-- (commit 2) - (commit 3) - demo
\-- (commit 4) - (commit 5) - PRO
Ich habe einen git rebase master
von PRO-Zweig ausprobiert , aber es passiert nichts.
Zur Verdeutlichung : Ich habe im Master gearbeitet und musste dann eine Produktdemo ( git checkout -b demo
und einige Commits) erstellen. Dann erstelle ich versehentlich einen weiteren Zweig aus der Demo ( git checkout -b PRO
und einigen Commits) und jetzt muss ich den PRO-Zweig verschieben, um die Demo zu meistern und intakt zu lassen. Am Ende hängen sowohl Demo als auch PRO vom Master.
Antworten:
Verwenden Sie
--onto
dafür:In Anbetracht Ihres Falles:
Grundsätzlich nehmen Sie alle Commits von nach
demo
bis zuPRO
und setzen sie erneut auf dasmaster
Commit.quelle
git rebase --onto first-branch second-branch second-branch
aber ich verstehe die Syntax nichtgit rebase --onto first-branch master second-branch
--onto
und wie sie schrieben, half mirgit rebase --onto newBase oldBase feature/branch
origin/newBase
ist der Name eines Zweigs, genau wienewBase
in meinem Beispiel. Es hängt nur davon ab, ob Sie auf einen Zweig zurückgreifen, der in Ihrem lokalen Repository (newBase
) oder auf dem Remote- Repository ( ) vorhanden istorigin/newBase
.newBase
ist der Name eines lokalen Zweigs undorigin/newBase
der Name eines Remote-Zweigs. Welches Sie wollen, hängt davon ab, worauf Sie sich stützen. Es ist nicht so, dass man arbeitet und man nicht, es ist so, dass sie sich auf verschiedene Dinge stützen. In der ursprünglichen Frage werden Fernbedienungen nie erwähnt, sodass die Verwendung von Fernbedienungen in meinem Beispiel nicht mit der gestellten Frage übereinstimmt.Ich werde versuchen, so allgemein wie möglich zu sein. Stellen Sie zunächst sicher, dass Sie sich in der gewünschten Branche befinden:
Verwenden Sie dann den folgenden Befehl (wo
new-base-branch
ist der Zweig, der Ihre neue Basis sein soll, undcurrent-base-branch
der Zweig, der Ihre aktuelle Basis ist.)Wenn Sie keine Konflikte haben, dann großartig - Sie sind fertig. Wenn Sie dies tun (in den meisten Fällen), lesen Sie bitte weiter.
Es können Konflikte auftreten, die Sie manuell lösen müssen. Git versucht nun , einen „3-Wege - Merge“ zwischen zu tun
current-branch
,current-base-branch
undnew-base-branch
. Ungefähr so wird Git intern funktionieren:Git wird zuerst das
current-base-branch
oben auf dem neu startennew-base-branch
. Es könnte Konflikte geben; die Sie manuell lösen müssen. Danach machen Sie normalerweisegit add .
undgit rebase --continue
. Hierfür wird ein neues temporäres Commit erstellttemp-commit-hash
.Danach wird Git Ihr
current-branch
oben auf neu aufbauentemp-commit-hash
. Es kann weitere Konflikte geben, die Sie erneut manuell lösen müssen. Sobald Sie fertig sind, fahren Sie erneut mitgit add .
und fort.git rebase --continue
Danach haben Sie Ihrecurrent-branch
Top- Version erfolgreich neu aufgebautnew-base-branch
.Hinweis: Wenn Sie anfangen,
git rebase --abort
Fehler zu machen, können Sie dies jederzeit während des Rebase-Vorgangs tun und zum Ausgangspunkt zurückkehren.quelle
rebase
Befehl, wie er gepostet wurde, gibt mir nur "fatal: ungültiger Upstream 'Current-Base-Branch'". Warum ist es überhaupt notwendig, GIT mitzuteilen, was der aktuelle übergeordnete Zweig des aktuellen Zweigs ist - sollte es das nicht schon wissen?Kasse zum
PRO
Verzweigen, Kopieren Sie die ältesten ( commit4 ) und neuesten ( commit5 ) Commit-Hashes dieses Zweigs und fügen Sie sie an einer anderen Stelle ein:Löschen Sie den
PRO
Zweig (führen Sie aus Sicherheitsgründen ein Backup). Erstellen und Auschecken in einen neuenPRO
Zweig vonmaster
:Nehmen Sie ( cherry-pick ) den Bereich der Festschreibungen von Zurück
PRO
Niederlassung in den neuenPRO
Zweig:Wenn nun alles in Ordnung ist, erzwingen Sie (-f) Push-to-
remote PRO
Branch und löschen Sie den lokalenPRO.bac
Branch:quelle
Ich hatte einen etwas anderen Ansatz mit Reset und Stashes, der das Löschen und Neuerstellen von Zweigen vermeidet und das Wechseln der Zweige überflüssig macht:
Wenn Sie den Zweig auf Commit-by-Commit-Basis zurücksetzen, spulen Sie im Grunde nur den Verlauf eines Commits nach dem anderen zurück.
quelle