Aktualisieren Sie die Git-Zweige vom Master

674

Ich bin neu bei Git und jetzt bin ich in dieser Situation:

  • Ich habe vier Zweige (Master, b1, b2 und b3).
  • Nachdem ich an b1-b3 gearbeitet hatte, wurde mir klar, dass ich am Zweigmaster etwas ändern muss, das in allen anderen Zweigen vorhanden sein sollte.
  • Ich habe geändert, was ich brauchte masterund ... hier ist mein Problem:

Wie aktualisiere ich alle anderen Zweige mit masterZweigstellencode?

Ionuț Staicu
quelle
3
Ich habe hier meine Antwort gefunden: Wie fügst du ausgewählte Dateien mit git-merge zusammen?
Wjandrea
58
Noch eine einfache Aufgabe, die Git erschwert hat. Die Git-Entwickler sollten Stack Overflow als Feedback in ihrer SDLC-Schleife verwenden. 300.000 Menschen sollten angeben, dass etwas mit dem Workflow von Git nicht stimmt. Sie müssen einen UX-Experten einstellen, weil sie es eindeutig nicht alleine schaffen können.
JWW

Antworten:

619

Sie haben zwei Möglichkeiten:

Das erste ist eine Zusammenführung, aber dies schafft ein zusätzliches Commit für die Zusammenführung.

Kasse jeder Filiale:

git checkout b1

Dann zusammenführen:

git merge origin/master

Dann drücken Sie:

git push origin b1

Alternativ können Sie eine Rebase durchführen:

git fetch
git rebase origin/master
Chris Kooken
quelle
14
Ich habe Bedenken wegen dieses Ansatzes. Wenn ich git log --graph ausführe, zeigt das Diagramm, dass der Master tatsächlich mit dem Themenzweig zusammengeführt wurde. Wird dies auf lange Sicht ein Problem verursachen? Ich dachte, die beste Vorgehensweise ist immer, den Themenzweig wieder zum Master zusammenzuführen. Bitte kommentieren.
Patrick
2
Achten
Hampus Ahlgren
22
Sie führen Master in b1 zusammen. Warum machst du got push origin master... keinen Sinn. Sie wechseln nicht den Hauptzweig. Ich denke, es ist ein Fehler mit 119 Upvote: /
Yves Lange
22
Verwenden Sie nicht die Zusammenführungsmethode, mit git rebase masterist die richtige Antwort
Weston Ganger
6
Für diejenigen von uns, die später lesen - @Kursions Besorgnis über den Tippfehler wurde durch die Bearbeitung des Autors angesprochen. Außerdem sagt die zweithöchste Antwort oben im Wesentlichen dasselbe wie diese Antwort, jedoch mit einem Diagramm der Zweigstruktur und einer Warnung, warum Sie nicht neu gründen möchten.
Beyondtheteal
494

Sie haben grundsätzlich zwei Möglichkeiten:

  1. Sie verschmelzen. Das ist eigentlich ganz einfach und eine perfekt lokale Operation:

    git checkout b1
    git merge master
    # repeat for b2 and b3
    

    Damit bleibt die Historie genau so, wie sie passiert ist: Sie haben sich vom Master getrennt, Änderungen an allen Zweigen vorgenommen und schließlich die Änderungen vom Master in alle drei Zweige integriert.

    gitkann diese Situation sehr gut bewältigen, sie ist für Zusammenführungen konzipiert, die gleichzeitig in alle Richtungen stattfinden. Sie können darauf vertrauen, dass alle Threads korrekt zusammengeführt werden können. Es ist einfach egal, ob Branch b1Merges masteroder masterMerges b1, das Merge Commit sieht für Git gleich aus. Der einzige Unterschied besteht darin, welcher Zweig auf dieses Zusammenführungs-Commit verweist.

  2. Sie Rebase. Personen mit einer SVN oder einem ähnlichen Hintergrund finden dies intuitiver. Die Befehle sind analog zum Zusammenführungsfall:

    git checkout b1
    git rebase master
    # repeat for b2 and b3
    

    Menschen mögen diesen Ansatz, weil er in allen Zweigen eine lineare Geschichte beibehält. Diese lineare Geschichte ist jedoch eine Lüge, und Sie sollten sich dessen bewusst sein. Betrachten Sie dieses Commit-Diagramm:

    A --- B --- C --- D <-- master
     \
      \-- E --- F --- G <-- b1
    

    Die Zusammenführung führt zur wahren Geschichte:

    A --- B --- C --- D <-- master
     \                 \
      \-- E --- F --- G +-- H <-- b1
    

    Die Rebase gibt Ihnen jedoch diese Geschichte:

    A --- B --- C --- D <-- master
                       \
                        \-- E' --- F' --- G' <-- b1
    

    Der Punkt ist, dass die Commits E', F'und G'nie wirklich existiert, und haben wahrscheinlich nie getestet. Sie können nicht einmal kompilieren. Es ist eigentlich recht einfach, unsinnige Commits über eine Rebase zu erstellen, insbesondere wenn die Änderungen in masterfür die Entwicklung in wichtig sind b1.

    Die Folge davon kann sein, dass Sie nicht , welche die drei Commits unterscheiden können E, Fund Gtatsächlich eine Regression eingeführt, um den Wert der abnehmenden git bisect.

    Ich sage nicht, dass Sie nicht verwenden sollten git rebase. Es hat seine Verwendung. Aber wann immer Sie es benutzen, müssen Sie sich der Tatsache bewusst sein, dass Sie über die Geschichte lügen. Und Sie sollten zumindest die neuen Commits testen.

cmaster - Monica wieder einsetzen
quelle
Ich habe einen anderen Quellzweig (nicht Master) zusammengeführt. Zusätzliche Schritte, um diese nette Antwort zu ergänzen, waren, sie vor dem Zusammenführen auf meinem lokalen Repo zu aktualisieren (um den neuesten Code lokal zu haben) : git checkout <source branch> git pull. Dann weiter mit oben: git checkout b1...
Rod
3
Als langjähriger SVN-Benutzer bevorzuge ich die Zusammenführungsoption gegenüber der Rebase: Bei jeder Versionskontrolle ist es sehr, sehr wichtig, genaue Aufzeichnungen über die von Ihnen vorgenommenen Änderungen und warum zu führen. Ich kann den Reiz der Rebase für die Vereinfachung des scheinbaren Verlaufs sehen, aber Sie sollten dann zurückgehen und die Commit-Kommentare von E ', F', G 'hinzufügen - und vorzugsweise die Rebase automatisch zu diesen Kommentaren hinzufügen lassen. Andernfalls müssen Sie herausfinden, warum die Änderungen ohne vollständige Informationen vorgenommen wurden, wenn der Build / Test / Test-Deployment-Prozess auf G 'unterbrochen wird.
WillC
12
Die Geschichte ist eine Lüge
piratemurray
Danke, ich benutze "git merge any-branch-name", um einen Zweigcode mit einem anderen Zweig zusammenzuführen. Vor Ort kann ich den Code von Zweig 1 testen, während ich in Zweig 2 bin
Priti
1
@blamb Die Zusammenführungskonflikte treten sowohl mit als auch git mergemit auf git rebase. Daran führt kein Weg vorbei. git rebasehat den Vorteil, dass Sie mehrere Phasen der Neuausrichtung ausblenden können (dh denselben Zweig nacheinander auf mehrere verschiedene Commits umbasieren, um die Anzahl der Konflikte in jeder Phase zu verringern). Die bloße Tatsache, dass eine Rebase über die Geschichte lügt, macht es jedoch viel einfacher, sich in einer solchen mehrstufigen Rebase gut zu machen ... Deshalb bevorzuge ich immer die Zusammenführung, auch wenn dies bedeutet, dass ich die Geschichte mit mehreren Zusammenführungs-Commits überladen muss .
cmaster
238

git rebase masterist der richtige Weg, dies zu tun. Das Zusammenführen würde bedeuten, dass ein Commit für die Zusammenführung erstellt würde, das erneute Basieren jedoch nicht.

Michael J. Gray
quelle
52
Was ist, wenn Sie bereits zum Ursprung gedrängt haben? Wenn Sie die Basis neu festlegen, schreiben Sie den Festschreibungsverlauf neu und dies steht in Konflikt mit Ihrem Remote-Zweig. Ich denke, Rebase sollte nur bei einem Pull verwendet werden oder wenn Sie nicht zu einem Remote-Zweig geschoben haben.
Matt Smith
6
Wenn Sie der einzige sind, der an der Remote-Verzweigung arbeitet, können Sie die Funktion git push --force origin verwenden, um Ihre Remote-Verzweigung mit einer neu basierten lokalen Verzweigung zu aktualisieren. stackoverflow.com/questions/8939977/…
Stormwild
7
Rebase und Merge beider Werke. Rebase ist am besten für private Zweige geeignet, da es ein übersichtlicheres Verlaufsdiagramm liefert. Diese Antwort ist die beste
Junchen Liu
5
Der Kompromiss zwischen Klarheit (ideal für Einzelbenutzer oder kleine Teams) und unordentlicher Wahrheit (für Codezweige mit mehreren Mitwirkenden - für die Wartbarkeit erforderlich (nach meiner Erfahrung - YMMV)) muss klarer sein.
WillC
1
re "was ist, wenn du schon gepusht hast?" -> Die goldene Regel für Git Rebase ist, es niemals in öffentlichen Zweigen zu verwenden .
Trevor Boyd Smith
53

Wenn Sie an einem Zweig ein- und ausgeschaltet haben oder in anderen Zweigen viel passiert ist, während Sie an etwas gearbeitet haben, ist es am besten, Ihren Zweig auf Master umzustellen. Dies hält die Geschichte aufgeräumt und macht es viel einfacher, den Dingen zu folgen.

git checkout master
git pull
git checkout local_branch_name
git rebase master
git push --force # force required if you've already pushed

Anmerkungen:

  • Bauen Sie keine Zweige zurück, an denen Sie mit anderen zusammengearbeitet haben.
  • Sie sollten sich auf den Zweig stützen, zu dem Sie zusammenführen, der möglicherweise nicht immer Master ist.

Unter http://git-scm.com/book/ch3-6.html finden Sie ein Kapitel zur Neugründung sowie zahlreiche andere Ressourcen im Internet.

Simon Bingham
quelle
Vielen Dank für die einfache Lösung
andere große Kerl
18

@cmaster gab die am besten ausgearbeitete Antwort. In Kürze:

git checkout master #
git pull # update local master from remote master
git checkout <your_branch>
git merge master # solve merge conflicts if you have`

Sie sollten den Zweigverlauf nicht neu schreiben, sondern ihn für zukünftige Referenzen im aktuellen Zustand halten. Beim Zusammenführen zum Master wird ein zusätzliches Commit erstellt, das jedoch günstig ist. Commits kosten nicht.

blauer Mond
quelle
13

So aktualisieren Sie andere Zweige wie (Backup) mit Ihrer Hauptzweigkopie. Sie können in beide Richtungen folgen (Rebase oder Merge) ...

  1. Führen Sie eine Neubasis durch (es wird keine zusätzliche Festschreibung für den Sicherungszweig vorgenommen).
  2. Zweige zusammenführen (es wird automatisch ein zusätzliches Commit für den Sicherungszweig durchgeführt).

    Hinweis: Rebase ist nichts anderes als das Einrichten einer neuen Basis (eine neue Kopie).

git checkout backup
git merge master
git push

(Wiederholen Sie diesen Vorgang für andere Zweige, z. B. backup2 & etc ..,)

git checkout backup
git rebase master
git push

(Wiederholen Sie diesen Vorgang für andere Zweige, z. B. backup2 & etc ..,)

Sundar Gsv
quelle
1

Für dieses Problem gibt es zwei Möglichkeiten.

1) Git Rebase

2) Git Merge

Nur diff mit oben beiden im Falle einer Zusammenführung, wird zusätzliche Festschreibung in der Geschichte haben

1) Git Checkout-Zweig (b1, b2, b3)

2) git rebase origin / master (Im Falle von Konflikten, die lokal durch git rebase gelöst werden - weiter)

3) Git Push

Alternativ ist die Option zum Zusammenführen von Git ähnlich

1) git checkout "your_branch" (b1, b2, b3)

2) Git Merge Master

3) Git Push

kris
quelle
0

So aktualisieren Sie Ihren Zweig vom Master:

  git checkout master
  git pull
  git checkout your_branch
  git merge master
D_Oghli
quelle