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
quelle
devel
wir 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,devel
als 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.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.
quelle
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
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.
quelle