Git-Verzweigungsstrategie für langfristigen unveröffentlichten Code


15

In unserem Team gibt es neben einzelnen Arbeitseinheiten (Stories) auch länger laufende Arbeitsthemen (Epics). Mehrere Geschichten machen ein Epos.

Traditionell hatten wir Feature-Zweige für jede Story und haben diese direkt zusammengeführt, um sie zu meistern, wenn sie die Qualitätssicherung bestehen. Wir möchten jedoch damit beginnen, die Veröffentlichung abgeschlossener Storys in einem Epic zurückzuhalten, bis das Epic als "Feature Complete" eingestuft wird. Wir werden diese Funktionen erst für die Produktion freigeben, wenn das gesamte Epic geschlossen ist. Außerdem haben wir einen nächtlichen Build-Server - wir möchten, dass alle geschlossenen Stories (einschließlich derjenigen, die Teil von unvollständigen Epics sind) automatisch auf diesem nächtlichen Server bereitgestellt werden.

Gibt es Vorschläge, wie wir unser Repo verwalten können, um dies zu erreichen? Ich habe darüber nachgedacht, "epische Zweige" einzuführen, bei denen wir geschlossene Geschichten mit dem zugehörigen epischen Zweig verschmelzen, anstatt sie direkt zu meistern, aber meine Bedenken sind:

  • Ich mache mir Sorgen über die Zusammenführungskonflikte, die entstehen können, wenn epische Zweige lange offen bleiben
  • Nächtliche Builds würden das Zusammenführen aller epischen Zweige zu einem "nächtlichen Build" -Zweig erfordern. Auch hier können Zusammenführungskonflikte auftreten, und dies muss automatisch erfolgen

Antworten:


23

Einfacher Vorschlag: Tu das nicht.

Git-Zweige sind nicht für lang laufende Gabeln des Codes, wie hier und https://blog.newrelic.com/2012/11/14/long-running-branches-considered-harmful/ beschrieben . Zweige werden am besten als vorübergehende Dinge behandelt, mit denen ein einzelner Entwickler täglich Commits organisiert. Wenn sie also einen Namen haben, der etwas entspricht, das einem Projektmanager (geschweige denn einem Endbenutzer) am Herzen liegt, tun Sie möglicherweise etwas falsch.

Es wird empfohlen, die kontinuierliche Integration mit Feature-Umschaltern oder nach Abstraktion zu verwenden, um Folgendes sicherzustellen:

  • Der gesamte Code ist zu jeder Zeit integriert (mindestens jeden Tag, vorzugsweise öfter).
  • Was bereitgestellt wird, wird explizit kontrolliert.

1
Ich vermutete, dass dies eine beliebte Antwort sein könnte! Mein Hauptanliegen dabei ist der Aufwand, immer sowohl die "Live" - ​​als auch die "Next" -Implementierung beizubehalten. Außerdem muss der Entwickler, der an einer Funktion arbeitet, im Voraus wissen, wie Änderungen als neue parallele Funktionen erstellt werden, anstatt die zu aktualisieren (/ ersetzen) vorhandene Funktionalität. Vermutlich erfordert es eine größere Änderung der Denkweise im Team.
Sitati

Es ist in Ordnung, Zweige zum Entwickeln von Code zu verwenden, aber niemals zum Speichern von Code. Wenn Sie sich also nicht sicher sind, ob es sich bei einer Aufgabe um einen 30-minütigen Fix oder eine 2-wöchige Nacharbeit handelt, starten Sie eine Zweigstelle. Sobald Sie wissen, können Sie entweder eine Abstraktion zusammenführen oder zu einer Abstraktion umgestalten / umschalten und dann zusammenführen.
Soru

@ Sitati: Ich habe gerade Code zusammengeführt, der sich in den letzten vier Monaten in einem Feature-Zweig befand. In der Zwischenzeit sind develwir von Autotools auf CMake umgestiegen, haben Travis CI eingeführt und den Code überarbeitet. Am Ende war es einfacher, die neue Funktion zu verstehen und sie manuell anzuwenden, develals zu versuchen, sie zusammenzuführen. Wir ließen auch neue Masterstudenten ein neues Feature in einem Zweig entwickeln, von dem sie sich zu Beginn ihrer Abschlussarbeit getrennt hatten. Nach einem Jahr schoben sie es und es gab keine Anstrengung, es wieder zusammenzuführen, so dass es Tag für Tag schwieriger wurde, es zusammenzuführen.
Martin Ueding

2
Der verlinkte Blogpost ist jetzt 5 Jahre alt. Ich hasse Feature-Toggles. Was ist falsch daran, langfristig zu verzweigen, regelmäßig vom Hauptzweig in den Feature-Zweig zurückzukehren und den langfristigen Feature-Zweig kontinuierlich zu integrieren?
Jason Kelley

CI ist der Name eines Prozesses, kein Werkzeug. Wenn Sie mehr als einen Feature-Zweig haben, werden diese normalerweise nicht kontinuierlich miteinander integriert. Das bedeutet, Probleme eher später als früher zu finden.
soru

1

Ich denke, dies ist ein ziemlich häufiges Problem und läuft darauf hinaus, auszuwählen, welche Funktionen in eine Version aufgenommen werden sollen, nachdem die Funktionen codiert wurden, anstatt zuvor.

z.B.

Ich habe Funktionen A, B und C für Version 2 meines Produkts. B und C sind verwandt, ich möchte B erst freigeben, wenn C auch fertig ist.

Ich habe drei Entwickler, die alle gleichzeitig an den Funktionen arbeiten.

Ich habe ein in Stein gemeißeltes Erscheinungsdatum D

B ist fertig und zusammengeführt, A ist fertig und zusammengeführt. C ist verzögert ... was mache ich ?!

Ich glaube nicht, dass es eine technische Lösung für dieses Problem gibt. Sie möchten eine nicht getestete Version des Produkts veröffentlichen, in der nur Funktion A enthalten ist. Solange Sie nicht alle möglichen Kombinationen von Funktionen zusammenführen und testen, ist dies immer möglich.

Die Lösung ist menschlicher. Sie haben Ihr Veröffentlichungsdatum verpasst und müssen es zurückschieben.


1

Dies ist ein heikles Problem, mit dem jedoch viele Menschen konfrontiert sind. Ich bevorzuge das Gitflow-Setup als Ausgangspunkt.

Entwicklung -> Neue Arbeiten am
Master -> Fertige Arbeiten, die getestet werden müssen Produktion -> Für die Produktion veröffentlichte Arbeiten .

Bei kleineren (kürzeren) Features erstelle ich einen Zweig aus der Entwicklung, erledige die Arbeit dort und füge den Zweig wieder zur Entwicklung zusammen.

Bei wichtigen (langfristigen) Features erstelle ich einen Zweig aus der Entwicklung, erstelle kleinere Zweige aus diesem Zweig und fasse dann zum ersten Zweig zusammen. Sobald das Hauptfeature fertig ist, geht es zurück in den Entwicklungszweig.

In regelmäßigen Abständen (projektabhängig) füge ich die Entwicklung wieder zum Master zusammen und ein Testzyklus beginnt. Wenn beim Testen Korrekturen auftreten, werden diese im Hauptzweig durchgeführt (Unterzweig wird dann zusammengeführt). Während des Testens kann die Entwicklung auf dem Master-Zweig fortgesetzt werden.

Der Master sollte jederzeit in die Entwicklung integriert werden, und die Entwicklung sollte in eine der langfristigen Unterzweigen integriert werden.

Der Master sollte (theoretisch) immer produktionsbereit sein. Die Entwicklung sollte (theoretisch) immer produktionsbereit sein. Der einzige Grund, warum es einen Unterschied gibt, ist die Bereitstellung einer soliden Reihe von Funktionen, die Tester testen können.

Wenn dies abgeschlossen ist, wird ein getestetes Commit in Master in die Produktion eingebunden, und die Bereitstellung in der Produktion erfolgt in diesem Zweig. Hotfixes, die im Notfall durchgeführt werden müssen, können dann in der Produktionsabteilung ausgeführt werden, ohne dass der Master zusammengeführt werden muss (was möglicherweise viele nicht getestete Änderungen zur Folge hat).

Mein normaler Baum sieht aus wie

 LongTerm -> Development -> Master -> Production    
 LongTerm <- Development      |            |  
     |       Development -> Master         |  
 LongTerm <- Development -> Master         |  
             Development <- Master         |  
                            Master -> Production  

Es ist meine allgemeine Regel, dass eine einzelne Änderung nicht länger als ein paar Stunden dauern sollte. Wenn dies der Fall ist, müssen kleinere Änderungen vorgenommen werden. Wenn es sich um ein riesiges Feature handelt (wie ein UI-Re-Write), ist dies langfristig der Fall, sodass die normale Entwicklung zur gleichen Zeit fortgesetzt werden kann. LongTerm-Niederlassungen sind normalerweise nur lokale Niederlassungen, während Entwicklung, Master und Produktion entfernte Niederlassungen sind. Alle Unterzweige sind ebenfalls nur lokal. Dies hält das Repository für andere sauber, ohne die Nützlichkeit von Git für einen langfristigen Funktionsumfang zu verlieren.

Ich möchte jedoch darauf hinweisen, dass die Existenz einer langfristigen Niederlassung eine seltene Sache ist. Normalerweise befindet sich meine ganze Arbeit in der Entwicklung. Nur wenn ich ein Feature (Set) habe, das so lange dauert, dass ich auch mit normalen Entwickler-Dingen arbeiten kann, verwende ich den LongTerm-Zweig. Wenn es sich nur um eine Reihe von Änderungen handelt, die zusammengeführt werden sollen, füge ich sie erst dann zusammen, wenn alles erledigt ist.


"Bei wichtigen (Langzeit-) Features erstelle ich einen Zweig aus der Entwicklung" - sollten Sie nicht neue Feature- (Entwicklungs-) Zweige aus der Produktionsbranche erstellen? Als Produktionszweig zu sehen ist releasefähiger Code.
Robotron

Nein, die Produktion ist bereits freigegeben, der Master ist der Produktion voraus und die Entwicklung ist dem Master voraus. Eine neue Funktion wie das Hinzufügen von Steuern zu Bestellsummen ist sinnlos, wenn Sie nicht an Code arbeiten, für den bereits Bestellungen vorliegen.
Coteyr

Wenn Sie jedoch von dev abzweigen und später wieder zusammenführen, wird dieser Zweig (und folglich Master und Produktion später) dann nicht alle von anderen vorgenommenen Entwicklungsänderungen bis zum Verzweigen einbeziehen? Einige dieser Änderungen sind möglicherweise nicht von der Qualitätssicherung genehmigt. Vielleicht sprachen wir über verschiedene Ansätze für das Release-Management.
Robotron

Ja, das ist der Punkt. QA-Tests für einen bestimmten SHA im Master, aber Sie können den Entwickler nicht davon abhalten.
Coteyr

"QA-Tests für eine bestimmte SHA im Master" -> QA testet jede neue Funktion als eigenständige Funktion? Lassen Sie mich an Ihnen ein typisches Szenario vorbeiführen, mit dem mein Team konfrontiert ist: Angenommen, Sie haben zwei lange laufende Projekte auf derselben Codebasis: Projekt A befindet sich im letzten Monat in der Qualitätssicherung und wird für einen weiteren Monat der Qualitätssicherung unterzogen. Projekt B befand sich in den letzten 6 Monaten in der Entwicklung und ist jetzt bereit für die Qualitätssicherung. Projekt A wird zum Master zusammengeführt und ist aufgrund zahlreicher subtiler Fehler in den Geschäftsregeln definitiv nicht produktionsbereit. Wie gehen wir mit Projekt B um? A und B müssen zusammen auf Interaktionen getestet werden (B verursacht beim Zusammenführen keine Konflikte).
Robotron
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.