Ist es besser, „oft“ zusammenzuführen oder erst nach Abschluss eine große Anzahl von Feature-Zweigen zusammenzuführen?

40

Angenommen, es werden mehrere Zweige Aund Bein inkrementeller "Bugfix" -Zweig entwickelt C.

Jetzt Cist schon "fertig" und mit dem Master verschmolzen. Aund Bbefinden sich noch in der Entwicklung und werden nicht behoben, bevor (möglicherweise) ein anderer Bugfix-Zweig in master zusammengeführt wird.

Ist es eine gute Idee, Cso schnell wie möglich in den neuen Feature-Zweigen zusammenzuführen? Damit die neuen Funktionen so nah masterwie möglich bleiben ? Oder ist es besser, die neue Funktion in ihrer eigenen "Welt" erst dann entwickeln zu lassen, wenn sie fertig ist?

Es wird sowieso Konflikte geben, daher muss Zeit darauf verwendet werden, diese zu beheben.

paul23
quelle
5
@gnat, bei dem es um das Zusammenführen von Features geht, verzweigt sich in eine Hauptzeile. Ich frage mich, ob das Zusammenführen von main zurück in das Feature während der Feature-Entwicklung gut ist, um "Konflikte frühzeitig zu lösen".
Paul23
1
@ paul23, ich würde sagen, das ist eine praktische Notwendigkeit.
Berin Loritsch
3
Ehrlich gesagt, ein großer Teil meiner Versionsprobleme ging verloren, als ich anfing, ordnungsgemäßes Design für meinen Code zu verwenden, z. B. das Isolieren von Modulen und das Erstellen eines genau definierten Arbeitsmodells. Wenn Sie während des Zusammenführens zu häufig über Probleme stolpern, könnte irgendwo ein anderes, ernsthafteres Problem auftauchen. Ein gutes Design ist unglaublich hilfreich, um unnötige Konflikte zu vermeiden.
T. Sar - Reinstate Monica
2
Möglicherweise möchten Sie regelmäßig vom Master zusammengeführt werden, um "genug" in der Nähe zu bleiben, damit die Zusammenführung später nicht zu schmerzhaft wird.
Thorbjørn Ravn Andersen

Antworten:

71

Je länger eine Niederlassung lebt, desto mehr kann sie von der Hauptniederlassung abweichen und desto unübersichtlicher und komplizierter wird die resultierende Zusammenführung sein, wenn sie endgültig abgeschlossen ist. Zehn kleine Konflikte sind einfacher zu lösen als ein massiver Konflikt und können Entwickler tatsächlich daran hindern, ihren Aufwand zu duplizieren oder zu verschwenden. Da sollten Sie verschmelzen masterin Aund Bregelmäßig; Einmal am Tag ist eine häufige Empfehlung. Wenn Sie jedoch in Ihren Filialen viel zu tun haben, möchten Sie möglicherweise mehrmals am Tag fusionieren.

Zusätzlich zur Erleichterung der Konfliktlösung erwähnen Sie ausdrücklich Ceinen Bugfix-Zweig. Als Entwickler möchte ich, dass meine Filiale über die neuesten Bugfixes verfügt, um sicherzustellen, dass ich kein Verhalten wiederhole, das zu einem Bug geführt hat, oder Tests schreibe, die auf fehlerhaften Daten basieren.

Es wird sowieso Konflikte geben, daher muss Zeit darauf verwendet werden, diese zu beheben.

Wenn Sie wissen, dass Konflikte auftreten werden, möchten Sie möglicherweise eine andere Verzweigungsstrategie anwenden. Behalten Sie nach Möglichkeit mehrere Änderungen an denselben Dateien in demselben Zweig bei, und reduzieren oder beseitigen Sie die Anzahl der Konflikte. Refaktorieren Sie Storys so, dass sie so weit wie möglich unabhängig sind, und überarbeiten Sie Zweige, um möglicherweise mehrere Storys abzudecken (Zweig, Feature und Story sind nicht immer austauschbar).

mmathis
quelle
33
Zusammenführen oder erneutes Basieren , da beim erneuten Basieren häufig ein bereinigter Commit-Verlauf erstellt wird.
chrylis -on strike-
11
@chrylis: Das erneute Laden kann gefährlich sein, wenn "Zweige decken mehrere Storys ab" bedeutet, dass zwei Entwickler an einem Zweig arbeiten.
Meriton - im Streik
9
@meriton aus den offiziellen Dokumenten: Stellen Sie Commits, die außerhalb Ihres Repositorys vorhanden sind, nicht wieder her. Wenn Sie diese Richtlinie befolgen, ist alles in Ordnung. Wenn Sie dies nicht tun, werden die Leute Sie hassen und Sie werden von Freunden und Ihrer Familie verachtet. LOL
Xtreme Biker
6
@XtremeBiker: Ein Rebase in Git ändert den Verlauf. Git funktioniert in dieser Hinsicht wie im echten Leben: Um die Geschichte zu verändern, braucht man eine Verschwörung. Es gibt einen Zweig im Repository für Git selbst, der regelmäßig umbasiert wird, und es ist ein sehr öffentlicher Zweig. Der Grund dafür ist, dass es eine Verschwörung gibt: Jeder, der diesen Zweig nutzt, ist damit einverstanden, die Geschichte zu bestimmten Zeiten neu zu schreiben, damit er sicherstellen kann, dass bis dahin alles verschmolzen ist.
Jörg W Mittag
1
@ paul23 Erwägen Sie ernsthaft, A und B an einen neuen gemeinsam genutzten Zweig zu übergeben, bevor Sie sie an den Master übergeben. Wenn es sich bei beiden um radikale Überholungen handelt, sollten Sie sie gemeinsam testen, bevor Sie die Kombination dem Master zuweisen. Wenn Sie sicher sind, können Sie einen direkt an den Master und den anderen an eine frisch aktualisierte Filiale liefern. Sie möchten wahrscheinlich in der Lage sein, den Originalcode der zweiten Funktion zu betrachten, falls die Zusammenführung nicht funktioniert oder Sie etwas neu entwerfen müssen.
Sinc
11

Angenommen, Sie möchten A, B irgendwann wieder mit dem Master zusammenführen und eine einzige Codebasis beibehalten, ist es niemals eine gute Idee, zu weit vom Master abzuweichen. Zu lange vom Master abzuweichen, insbesondere wenn Fehlerbehebungen und andere Entwicklungen beim Entwickeln von A, B zum Master verschmelzen, wird mit Sicherheit zu Konflikten führen.

Ich würde Strategien in Betracht ziehen, die den folgenden ähnlich sind

  1. Wer für A, B verantwortlich ist, sollte den Meister genau beobachten und Änderungen einarbeiten.
  2. Besser noch, wenn Sie über Build- und Testautomatisierung verfügen, stellen Sie sicher, dass A, B im Master zusammengeführt werden und bestehen Sie die Tests jede Nacht.
  3. Basierend auf Ihrem Kommentar zu einer anderen Antwort scheint es, dass A, B eine Weile brauchen könnten, um sich zu entwickeln. In diesem Fall können Sie sogar erwägen, A und B zusammenzuführen, damit Sie am Ende keine größeren Probleme haben, beide wieder zum Master zusammenzuführen.
  4. Überlegen Sie sich auf einer höheren Ebene, warum Sie zwei separate Entwicklungslinien benötigen. Könnten Sie sich in kleinere Zusammenschlüsse aufteilen? Könnten Sie in separate Mikrodienste einbrechen?
Kenchew
quelle
5

In der Regel ist oft besser als eine massive.

Kleinere, häufigere Pull-Anforderungen sind fast immer besser.

Ich habe damit begonnen, hauptsächlich Konfigurationsflags zu verwenden, damit ich frühzeitig kleinere Pull-Anforderungen ausführen kann, um wiederum Code einfacher zusammenzuführen, aber die Funktion deaktiviert zu lassen. Je kleiner die Pull-Anforderung ist, desto einfacher ist es, den Code zu überprüfen, auch wenn insgesamt mehr Pull-Anforderungen vorliegen. Die meisten Menschen jeder Art werden keine aussagekräftigen Überprüfungen von massiven Pull-Anfragen durchführen können. Es ist einfach zu schwierig für den mentalen Arbeitsspeicher, alle möglichen Auswirkungen einer massiven Codeänderung zu verstehen.

Das Erstellen eines Konfigurations-Flags ist mit einem zusätzlichen Aufwand verbunden, sodass es sich bei kleineren Features nicht lohnt. Aber dann wird Ihre Pull-Anfrage trotzdem klein sein.

Es kann jedoch Situationen geben, in denen die Funktion auf einmal freigegeben werden muss. Selbst dann ist es möglicherweise besser, kleinere Pull-Anforderungen an einen anderen Zweig zu richten, der für diesen Zweck erstellt wurde.

Die meisten meiner Kollegen stöhnen, wenn jemand einen massiven Pull-Request erzeugt, und das zum größten Teil zu Recht.

Beachten Sie auch, dass ich manchmal Commits in separaten Zweigen auswählen muss. Wenn das, was gepflückt werden muss, in einem einzigen Commit zusammengefasst werden kann, ist es einfacher, es in andere Zweige zu verschieben. Dies ist ein Fall, in dem es besser ist, nur wenige Commits zu haben, aber es ist nicht genau der Standardprozess, wenn Ihre Kirsche herumpflückt.

Mark Rogers
quelle
1
Feature-Flags können kostspielig sein (450 Millionen USD in 45 Minuten). Dieses Beispiel wird auch von Onkel Bob erwähnt (jedoch ohne jegliche technische Unterstützung (wie zu erwarten)).
Peter Mortensen
1
Ja, da ist der Aufwand, sie irgendwann zu entfernen, obwohl es normalerweise nicht so schwer ist. Man könnte sie länger warten, aber dann bietet die Flagge eine größere Verwendung. Ich bin damit einverstanden, dass alles schief gehen kann, wenn es willkürlich oder ohne Nachverfolgung geschehen ist. Es kann jedoch zu Problemen kommen, wenn eine große Pull-Anfrage schwer zu überprüfen ist. Auf der anderen Seite sind einige Benutzer möglicherweise nicht in der Lage, der App, an der sie arbeiten, so etwas wie ein Konfigurationsflag hinzuzufügen. Im Allgemeinen hilft es bei der UAT und dem Rollout eines Features.
Mark Rogers
3

In Refactoring von Martin Fowler gibt er den Rat, niemals einen Zweig länger als einen Tag vom Meister abzweigen zu lassen. IIRC, Sie sollten eine kleine Änderung vornehmen, testen, um sicherzustellen, dass Sie nichts kaputt gemacht haben, und es dann wieder zusammenführen.

JohnnyApfelmus
quelle
2
Gut Aund Bhalten Sie radikale Neuüberholungen an, wie die Anwendung funktioniert, sie werden nicht innerhalb eines Monats "erledigt". Sie sind jedoch auch nutzlos, bevor sie fertig sind ...
Paul23
8
Sie sind möglicherweise nicht unbrauchbar, bevor sie fertig sind - sie bieten einen Mehrwert, indem sie einen Schritt in Richtung des vollständigen Ergebnisses darstellen und den Arbeitsaufwand in Zukunft verringern. Mit Techniken wie Feature-Umschalten, Verzweigen nach Abstraktion oder einfach dem letzten Teil der Benutzeroberfläche sollte es möglich sein, die unvollständige Arbeit sicher zum Master zusammenzuführen.
BDSL
1
Das ist der Grund, warum es für eine längerfristige Entwicklung praktisch ist, Ihr lokales System über alle Änderungen in der Hauptniederlassung zu aktualisieren. Behalten Sie Ihre Arbeit bei, als wäre sie gerade vom neuesten
Zweig
2

Eine andere Option für wirklich langlebige Änderungen, die möglicherweise abgeschlossen, aber noch nicht einsatzbereit sind, besteht darin, sie hinter ein Feature-Flag zu setzen, damit sie zum Master zusammengeführt werden können, ohne dass das Risiko besteht, dass etwas kaputt geht. Sobald sie einsatzbereit sind, kann das Feature-Flag entfernt werden.

Qwertie
quelle
1
Feature Flags = Zombie Code (bis zur Wiederbelebung)?
Peter Mortensen
@ PeterMortensen Nun, Sie müssen versuchen, Flaggen so schnell wie möglich zu entfernen, aber es könnte in bestimmten Situationen
funktionieren
3
@PeterMortensen nicht, wenn die Flagge für mindestens eine Person eingeschaltet ist
Ian