Feature-Zweig auf einen anderen Feature-Zweig umstellen

305

Ich habe zwei (private) Feature-Zweige, an denen ich arbeite.

a -- b -- c                  <-- Master
     \     \
      \     d -- e           <-- Branch1
       \
        f -- g               <-- Branch2

Nachdem ich einige Zeit an diesen Zweigen gearbeitet habe, habe ich festgestellt, dass ich die Änderungen von Zweig2 in Zweig1 benötige. Ich möchte die Änderungen in Branch2 auf Branch1 übertragen. Am Ende möchte ich Folgendes haben:

a -- b -- c                  <-- Master
           \
            d -- e -- f -- g <-- Branch1

Ich bin mir ziemlich sicher, dass ich den zweiten Zweig auf den ersten umstellen muss , aber ich bin mir nicht ganz sicher, welche Syntax korrekt ist und welchen Zweig ich hätte auschecken sollen.

Wird dieser Befehl das gewünschte Ergebnis liefern?

(Branch1)$ git rebase --onto Branch1 Branch2
Arjen
quelle
11
Um Ihre Frage zu beantworten, würde ich ein Test-Repository erstellen, die von Ihnen angezeigte Commit-Struktur erstellen und den angezeigten Befehl ausprobieren. Aber ich denke, Sie können das selbst tun, also werde ich es nicht tun :)
Daniel Hilgarth
3
Vielen Dank. Ich war so sehr darauf bedacht, dies beim ersten Mal richtig zu machen, dass mir nicht
Arjen
4
Ich dachte schon, deshalb habe ich diesen Kommentar gepostet :) Jedes Mal, wenn ich etwas tue, bin ich mir nicht sicher, ob es das tut, was ich denke, dass es funktioniert, erstelle ich ein Test-Repository und führe dort meine Tests durch. Oder ich erstelle eine Kopie meines realen Repositorys und führe die Tests für die Kopie durch.
Daniel Hilgarth
Hinweis: Git 2.0 führt eine Verknüpfung für diese Art von Rebase ein : git rebase -. siehe meine Antwort unten
VonC
5
Kleinere Anmerkung: Die Antworten hier geben branch2 als Ergebnis. Das OP wollte branch1. Oder habe ich etwas verpasst?
Josef.B

Antworten:

353
  1. Wechseln Sie zu Branch2

    git checkout Branch2
    
  2. Übernehmen Sie die aktuellen (Branch2) Änderungen zusätzlich zu den Branch1-Änderungen und bleiben Sie in Branch2:

    git rebase Branch1
    

Was würde Sie mit dem gewünschten Ergebnis in Branch2 verlassen:

a -- b -- c                      <-- Master
           \
            d -- e               <-- Branch1
           \
            d -- e -- f' -- g'   <-- Branch2

Sie können Branch1 löschen.

sasikt
quelle
Vielen Dank! Beim Löschen des Zweigs nach dem erneuten Basieren wird die Meldung angezeigt, dass der Zweig nicht vollständig zusammengeführt wurde. Ich gehe davon aus, dass ich diese Nachricht ignorieren und das Löschen erzwingen kann.
Arjen
10
wollte er nicht alle Änderungen in Branch1 haben?
tomasz_kusmierczyk
6
Dies scheint das Gegenteil von dem zu sein, was er wollte, nein?
1252748
1
In der Tat, @tomasz_kusmierczyk und @ 1252748, und ich war auch selbst verwirrt. Aber dann wurde mir klar, dass das Ausführen git rebasewährend des Aufenthalts in Branch1 den Verlauf von Branch1 neu schreibt, damit die Änderungen von Branch1 zusätzlich zu den Änderungen von Branch2 übernommen werden. Dies führt zu der folgenden Festschreibungsreihenfolge a - b - f - g - c' - d' - e'.
Aal Gheez
1
@tomasz_kusmierczyk und 1252748, das ist nicht das Gegenteil von dem, was er will, das ist genau das, was er wollte. Filialnamen spielen keine Rolle, Sie können sie jederzeit ändern.
a3y3
56

Hinweis: Wenn Sie eingeschaltet waren Branch1, können Sie mit Git 2.0 (Q2 2014) Folgendes eingeben:

git checkout Branch2
git rebase -

Siehe Commit 4f40740 von Brian Gesiakmodocache :

rebase: Erlaube " -" Kurzschrift für den vorherigen Zweig

Lehren Sie Rebase die gleiche Abkürzung wie checkoutund merge, um den Zweig rebasedem aktuellen Zweig zuzuweisen . Das heißt, " -" bedeutet "den Zweig, in dem wir zuvor waren".

VonC
quelle
26
schön, aber auch ein bisschen gefährlich. manchmal gewinnt die Ausführlichkeit. aber
andererseits
3

Ich weiß, dass Sie um Rebase gebeten haben, aber ich würde die Commits auswählen, die ich stattdessen von Branch2 zu Branch1 verschieben wollte. Auf diese Weise müsste ich mich nicht darum kümmern, wann der Zweig vom Master erstellt wurde, und ich hätte mehr Kontrolle über das Zusammenführen.

a -- b -- c                  <-- Master
     \     \
      \     d -- e -- f -- g <-- Branch1 (Cherry-Pick f & g)
       \
        f -- g               <-- Branch2
Craigo
quelle