427 Stimmen

Branchenfunktionszweig auf einen anderen Branchenfunktionszweig zurücksetzen

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

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

Nachdem ich eine Weile an diesen Branches gearbeitet habe, habe ich festgestellt, dass ich die Änderungen von Branch2 in Branch1 benötige. Ich möchte die Änderungen in Branch2 auf Branch1 neu basieren. Ich möchte am Ende folgendes haben:

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

Ich bin mir ziemlich sicher, dass ich den zweiten Branch auf den ersten neu basieren muss, bin mir aber nicht ganz sicher über die korrekte Syntax und welchen Branch ich ausgecheckt haben sollte.

Wird dieser Befehl das gewünschte Ergebnis liefern?

(Branch1)$ git rebase --onto Branch1 Branch2

476voto

sasikt Punkte 5264
  1. Wechseln Sie zu Branch2

    git checkout Branch2
  2. Wenden Sie die aktuellen (Branch2) Änderungen auf die Branch1-Änderungen an, bleiben Sie in Branch2:

    git rebase Branch1

Dies würde Sie mit dem gewünschten Ergebnis in Branch2 zurücklassen:

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

Sie können Branch1 löschen.

71voto

VonC Punkte 1117238

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

git checkout Branch2
git rebase -

Das - als rebase-Parameter bedeutet in diesem Fall 'den Branch, auf dem wir zuvor waren'. Siehe Commit 4f40740 von Brian Gesiak modocache:

rebase: Erlaube "-" als Kurzform für den vorherigen Branch

Bringe rebase bei, dieselbe Kurzform wie bei checkout und merge zu verwenden, um den Branch zu benennen, auf den der aktuelle Branch rebase soll; das heißt, dass "-" "den Branch, auf dem wir zuvor waren" bedeutet.

Verwenden Sie dieses Feature mit Vorsicht, da es weniger explizit ist und ein kleiner Fehler zu einem durcheinandergebrachten Zustand führen könnte.

23voto

Asfand Qazi Punkte 6169

Diese Lösung sollte genau das tun, was verlangt wurde (die Commits von Branch2 oben auf Branch1 hinzufügen, während man auf Branch1 bleibt):

git checkout Branch1
git cherry-pick master..Branch2

Am Ende haben Sie das hier.

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

Dies wird jeden der Commits auf Branch2 nacheinander auf Branch1 übernehmen. Dann können Sie Branch2 löschen.

11voto

Craigo Punkte 2962

Ich weiß, du hast darum gebeten, zu Rebase, aber ich würde stattdessen die Commits aus Branch2 für Branch1 auswählen (Cherry-Pick). Auf diese Weise müsste ich mich nicht darum kümmern, wann welcher Branch 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

3voto

pkini Punkte 31

Verstehe ich diese Frage falsch? Mein Instinkt sagte mir, --onto Flagge von rebase wie folgt zu verwenden:

git rebase --onto Branch1 master Branch2

Vor dem Rebase:

* 6263580 (HEAD -> Branch2) add g
* c802c88 add f
| * c80cfb0 (Branch1) add e
| * aea5708 add d
| * 2e522fe (master) add c
|/  
* 0613527 add b
* e2a0c4d add a

Nach dem Rebase:

* 7f6a363 (HEAD -> Branch2) add g
* 4cbab60 add f
* c80cfb0 (Branch1) add e
* aea5708 add d
* 2e522fe (master) add c
* 0613527 add b
* e2a0c4d add a

Dies macht es explizit und klar, welche Commit-Sets auf welche übernommen werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X