In einem Versuch, Git Nirvana zu erreichen, verbringe ich den Tag damit, zu lernen, wie man Rebase für Situationen nutzt, in denen ich gerade fusioniere.
Wenn ich einen meiner Meinung nach git 101-Flow durchlaufe (den ich unten darlege), muss ich push --force
meine Änderungen auf den Ursprung zurückschieben.
Ich bin nicht der einzige - ich weiß, dass dies überdachter Boden ist (siehe 1 , 2 , 3 , 4 , 5 ), und ich verstehe die technischen Gründe, warum eine Kraft notwendig ist. Mein Problem ist folgendes: Es gibt viele (viele) Blogeinträge, die das Lob der Rebase singen und wie es ihr Leben verändert hat (siehe 1 , 2 , 3 , 4, um einige aufzulisten ), aber keiner von ihnen erwähnt, dass dies push --force
Teil davon ist ihr Fluss. Fast jede Antwort auf die vorhandenen Fragen zum Stapelüberlauf sagt jedoch Dinge wie "Ja, wenn Sie neu aufbauen wollen, müssen Sie sie verwenden push --force
".
Angesichts der Anzahl und Religiosität von Rebase-Befürwortern muss ich glauben, dass die Verwendung von Push-Force kein fester Bestandteil eines Rebase-Flusses ist und dass sie etwas falsch machen, wenn man ihre Pushs oft erzwingen muss .
push --force
ist eine schlechte Sache .
Also hier ist mein Fluss. Auf welche Weise könnte ich ohne Kraft die gleichen Ergebnisse erzielen?
Einfaches Beispiel
Zwei Zweige:
- v1.0 - ein Release-Zweig, der nur Patches enthält
- Master - alles für die nächste Hauptversion.
Ich habe ein paar Patch-Commits und ein paar Commits für die nächste Version.
Ich möchte die Patches in meinen Master integrieren, damit sie für die nächste Version nicht verloren gehen. Vorerleuchtung Ich würde einfach:
git checkout master
git merge v1.0
Aber jetzt versuche ich es
git checkout master
git rebase v1.0
Also jetzt bin ich hier:
Zeit für:
git push
Kein Würfel.
quelle
@ CodeGnome ist richtig. Sie sollten den Master nicht auf dem Zweig v1.0 neu gründen, sondern den Zweig v1.0 auf dem Master, da dies den Unterschied ausmacht.
Erstellen Sie einen neuen Zweig, der auf v1.0 verweist, verschieben Sie diesen neuen Zweig über den Master und integrieren Sie dann die neue Version der V1.0-Patches in den Master-Zweig. Sie werden am Ende so etwas wie:
Diese Art der Verwendung von Rebase wird in der offiziellen Git-Dokumentation empfohlen .
Ich denke, Sie haben Recht
git push --force
: Sie sollten es nur verwenden, wenn Sie einen Fehler gemacht und etwas gepusht haben, das Sie nicht wollten.quelle
master
und nichts dagegen haben, den Feature-Zweig selbst zusammenzuführen, kann dies getan werden mit:git checkout my-branch; git rebase master; git checkout master; git merge my-branch
Sie müssen Push erzwingen, wenn Sie die Basis neu festlegen, und Sie haben Ihre Änderungen bereits veröffentlicht, oder?
Ich verwende Rebase für eine ganze Reihe, aber ich veröffentliche entweder auf etwas Privates, bei dem ein Force-Push keine Rolle spielt (z. B. mein eigener Klon auf GitHub als Teil einer Pull-Anfrage), oder ich habe eine Rebase, bevor ich zum ersten Mal Push mache.
Dies ist das Herzstück des Workflows, in dem Sie Rebase verwenden, aber Push nicht viel erzwingen: Veröffentlichen Sie Dinge erst, wenn sie fertig sind, und Rebase nicht nach Push.
quelle
rebase
neue Änderungen in Ihren Themenzweig übernommen, aber wenn Sie die Änderungen in diesem Zweig abgeschlossen haben, kehren Siemerge
in den Hauptentwicklungszweig zurück.Ich denke, es gibt einen guten Anwendungsfall für dieses Rebase-Then-Force-Push-Muster, der nicht auf einen fehlerhaften Push zurückzuführen ist: Sie arbeiten selbst an einem Feature-Zweig von mehreren Standorten (Computern) aus. Ich mache das oft, da ich manchmal im Büro auf meinem Desktop und manchmal von zu Hause / vom Kunden vor Ort auf meinem Laptop arbeite. Ich muss gelegentlich neu aufbauen, um mit dem Hauptzweig Schritt zu halten und / oder Zusammenführungen sauberer zu machen, aber ich muss auch Druck ausüben, wenn ich eine Maschine verlasse, um an einer anderen zu arbeiten (wo ich nur ziehe). Funktioniert wie ein Zauber, solange ich der einzige bin, der an der Niederlassung arbeitet.
quelle
Folgendes verwende ich (vorausgesetzt, Ihr Filialname ist foobar ):
quelle
git
ist nicht ohne Persönlichkeitgit merge -s ours origin/<branch>
war das, was es für uns behoben hattl; dr mit gemeinsam genutzten Zweigen zusammenführen, mit einzelnen Zweigen neu gründen.
--force-with-lease
ist eine sicherere Alternative zu Gewalt und sollte Ihnen helfen, dieses Git-Nirvana ohne die zerstörerische Natur von Gewalt zu erreichen.Eine allgemeine Faustregel, die ich für die Workflows verschiedener Teams gesehen habe, ist die Verwendung
merge
für gemeinsam genutzte Zweige (dh Master, Master oder Entwicklung) und die Verwendungrebase
bei der Arbeit an Ihrem eigenen Feature-Zweig. Hier ist ein typischer Lebenszyklus eines Feature-ZweigsEine einfache englische Version von dem, was wir hier gemacht haben:
force-with-lease
Der vierte Schritt ist WIRKLICH wichtig und einer der Hauptgründe, warum ich mich für die Verwendung von Rebase ausgesprochen habe.
force-with-lease
Überprüft die Fernbedienung, um festzustellen, ob neue Commits hinzugefügt wurden. Wenngit push
sich herausstellt, dass Sie destruktiv sind, wird es nicht schieben!Ich hoffe, dies gibt jemandem mehr Vertrauen in die Verwendung von Rebase.
quelle