Verzweigungsstrategien [geschlossen]


73

Das Unternehmen, für das ich arbeite, hat allmählich Probleme mit dem aktuellen Verzweigungsmodell und ich habe mich gefragt, welchen unterschiedlichen Arten von Verzweigungsstrategien die Community ausgesetzt war.

Gibt es gute für verschiedene Situationen? Was verwendet Ihr Unternehmen? Was sind die Vor- und Nachteile von ihnen?



@ CasperOne, das ist wahrscheinlich die lustigste Art, mit einem Nur-Link-Antwort-Flag umzugehen, das ich je gesehen habe
Mücke

1
@gnat Kommt Teil des Pakets mit der Behandlung der Flagge auf der Antwort. =)
casperOne

6
Ich denke, dies ist ein sehr gutes Q und sollte nicht als NICHT KONSTRUKTIV geschlossen werden.
Gupta

Antworten:


54

Hier ist die Methode, die ich in der Vergangenheit mit gutem Erfolg angewendet habe:

/ Rumpf - Blutungskante. Nächste Hauptversion des Codes. Kann zu einem bestimmten Zeitpunkt funktionieren oder nicht.

/branches/1.0, 1.1 usw. Stabile Wartungszweige des Codes. Wird verwendet, um Fehler zu beheben und neue Versionen zu stabilisieren. Wenn es sich um eine Wartungsniederlassung handelt, sollte diese (falls zutreffend) kompiliert und jederzeit für die Qualitätssicherung / den Versand bereit sein. Wenn es sich um einen Stabilisierungszweig handelt, sollte dieser kompiliert und vollständig sein. Es sollten keine neuen Funktionen hinzugefügt, kein Refactoring und keine Codebereinigungen durchgeführt werden. Sie können ein Präfix hinzufügen, um Stabilisierungszweige gegenüber Wartungszweigen anzugeben.

/ branches / cool_feature. Wird für sehr experimentelle oder zerstörerische Arbeiten verwendet, die möglicherweise in den Kofferraum (oder in einen Wartungszweig) gelangen oder nicht. Keine Garantie für das Kompilieren, Arbeiten oder sonstige Verhalten von Code. Sollte so kurz wie möglich dauern, bevor Sie in den Hauptzweig übergehen.

/tags/1.0.1, 1.0.2, 1.1.3a usw. Wird zum Kennzeichnen einer verpackten und versendeten Version verwendet. Niemals ändern. Erstellen Sie so viele Tags, wie Sie möchten, aber sie sind unveränderlich.


Verzweigen Sie in Ihren Ordnern branch / cool_feature den gesamten Trunk oder nur bestimmte Unterordner?
Swilliams

1
Normalerweise ist es der ganze Kofferraum. In seltenen Fällen berührt eine Funktion nur ein Verzeichnis. Ich empfehle auch svnmerge.py, wenn Sie nicht svn 1.5 ausführen. macht den gesamten Verzweigungs- / Zusammenführungsprozess viel schöner.
Jcoby

2
Sie präsentieren ein sehr gutes, durchdachtes Modell. Eine Richtlinie, die mein Unternehmen durchsetzt, und ich denke, dass dies ziemlich häufig ist, ist, dass der Trunk immer alle Tests erstellen und bestehen sollte. Sie sagen also unter Ihrem Modell, dass es "funktionieren kann oder nicht". Es gibt unterschiedliche Stabilisierungsgrade, und ich denke, dass die Durchsetzung der Regel, dass der Trunk immer erstellt und automatisierte Tests immer bestanden werden sollten, im Allgemeinen eine gute Regel ist.
RjOllos

Wenn Sie Zweige verwenden, um "neue Releases zu stabilisieren", wie können Sie sie dann (kontinuierlich) erstellen und (automatisch) testen? Für mich ist das Wesentliche an Trunk, dass es die Version ist, die nach jedem Commit (kontinuierlich) erstellt und (automatisch) getestet wird. Ich denke, man sollte eine Veröffentlichung innerhalb eines Trunks stabilisieren und Zweige sowohl für zukünftige als auch für frühere Versionen verwenden, während Trunk für die aktuelle Version sein sollte. Und wenn es möglich ist, alle Zweige (kontinuierlich) aufzubauen und (automatisch) zu testen, wird kein Stamm benötigt. Habe ich recht?
Michal Czardybon

20

Ich würde Eric Sinks Meinung zu diesem Thema sehr empfehlen:

Kapitel 7: Zweige

Ich, wie Eric, bevorzuge die Verzweigung im "Ordner" -Stil, über die er spricht.


5
Eric sagte: "Einfache Änderungen. Wie oben in meinem" Eddie "-Szenario erwähnt, verzweigen Sie nicht für jede Fehlerbehebung oder Funktion." Bei neuen SCMs ist dies jedoch nicht mehr der Fall. SVN-Leute sagten dasselbe, bis sie die richtige Verzweigung implementiert hatten ... Und GIT-Leute werden das nie sagen ... Aber normalerweise sagen Leute hinter einer bestimmten Versionskontrolle, was sie nicht können, ist es nicht wert, getan zu werden ...: - (
Pablo

Eric überarbeitet das HOWTO und ich glaube, er macht daraus sogar ein Buch. Die Popularität von Systemen wie git und hg ist auch ein Thema in einigen seiner neuesten Blog-Beiträge.
Ryan Duffield


7

Unser Repository sieht aus wie:

/trunk
/branches
/sandbox
/vendor
/ccnet

/ trunk ist Ihre Standardentwicklung. Wir verwenden CI, daher muss dies immer Tests erstellen und bestehen.

/ branches Hier setzen wir "sanktionierte" große Änderungen ein, dh etwas, von dem wir wissen, dass es in den Kofferraum gelangt, aber möglicherweise etwas Arbeit benötigt und CI brechen würde. Auch dort, wo wir an Wartungsversionen arbeiten, die ihre eigenen CI-Projekte haben.

/ sandbox Jeder Entwickler hat seine eigene Sandbox sowie eine gemeinsam genutzte Sandbox. Dies gilt für Aufgaben wie "Fügen wir unserem Produkt einen LINQ-Anbieter hinzu", die Sie ausführen, wenn Sie nicht Ihre eigentliche Arbeit erledigen. Es kann schließlich in den Kofferraum gehen, es kann nicht, aber es ist da und unter Versionskontrolle. Kein CI hier.

/ Vendor Standard Vendor Branch für Projekte, in denen wir kompilieren, aber keinen Code pflegen.

/ ccnet Dies sind unsere CI-Tags, die nur der CI-Server hier schreiben kann. Im Nachhinein hätten wir gesagt, wir sollten dies in etwas Allgemeineres wie CI, BUILDS usw. umbenennen.


7
  1. Ein Zweig für die aktive Entwicklung (/ main oder master, je nach Fachsprache)
  2. Ein Zweig für jede Wartungsversion -> es werden nur wirklich kleine Korrekturen erhalten, während alle wichtigen Entwicklungen an / main gehen
  3. Ein Zweig für jede neue Aufgabe: Erstellen Sie einen neuen Zweig, um an jedem neuen Eintrag in Ihrer Bugzilla / Jira / Rallye zu arbeiten. Legen Sie häufig fest, dokumentieren Sie die Änderung mithilfe von Zoll-Kiesel-Checkins selbst und führen Sie sie erst dann wieder in den übergeordneten Zweig ein, wenn sie abgeschlossen und gut getestet ist.

Werfen Sie einen Blick auf diese http://codicesoftware.blogspot.com/2010/03/branching-strategies.html für eine bessere Erklärung


6

Das erste: KISS (Halte es einfach dumm!)

/Geäst
  /RB-1.0 (* 1)
  /RB-1.1 (* 1)
  /RB-2.0 (* 1)
/Stichworte
  /REL-1.0 (oder wie auch immer Ihre Version aussieht, zB 1.0.0.123 * 2)
  /REL-1.1
  /REL-2.0
/Kofferraum
  aktuelle Entwicklung mit coolen neuen Features ;-)

* 1) Halten Sie die Version wartbar - z. B. Service Packs, Hotfixes, Bugfixes, die bei Bedarf und / oder bei Bedarf mit dem Trunk zusammengeführt werden können.) * 2) major.minor.build.revision

Faustregeln:

  1. Der Tags-Ordner muss nicht ausgecheckt werden
  2. Nur wenige Codierungen in Release-Zweigen (vereinfacht das Zusammenführen) - keine Code-Bereinigung usw.
  3. Niemals im Tags-Ordner codieren
  4. Fügen Sie niemals konkrete Versionsinformationen in Quelldateien ein. Verwenden Sie Platzhalter oder 0.0.0.0, die der Erstellungsmechanismus durch die von Ihnen erstellte Versionsnummer ersetzt
  5. Fügen Sie niemals Bibliotheken von Drittanbietern in Ihre Quellcodeverwaltung ein (auch niemand fügt SVN STL-, MFC- usw. Bibliotheken hinzu ;-))
  6. Nur festgeschriebenen Code festschreiben
  7. Verwenden Sie lieber Umgebungsvariablen anstelle von fest codierten Pfaden (absolute und relative Pfade).

--hfrmobile


3

Wir verzweigen uns, wenn eine Veröffentlichung für die endgültige Qualitätssicherung bereit ist. Wenn während des QS-Prozesses Probleme festgestellt werden, werden die Fehler in der Verzweigung behoben, validiert und dann mit dem Trunk zusammengeführt. Sobald der Zweig die Qualitätssicherung bestanden hat, kennzeichnen wir ihn als Release. Alle Hotfixes für diese Version werden auch für den Zweig vorgenommen, validiert, mit dem Trunk zusammengeführt und dann als separate Version markiert.

Die Ordnerstruktur würde folgendermaßen aussehen (1 QA-Zeile, 2 Hotfix-Releases und der Trunk):

/Geäst

/REL-1.0

/Stichworte

/REL-1.0

/REL-1.0.1

/REL-1.0.2

/Kofferraum


3

Wir verwenden den wilden, wilden Weststil der Git-Zweige. Wir haben einige Niederlassungen mit bekannten Namen, die durch Konventionen definiert sind. In unserem Fall sind Tags jedoch für uns wichtiger, um die Anforderungen unserer Unternehmensprozessrichtlinien zu erfüllen.

Ich habe unten gesehen, dass Sie Subversion verwenden, daher denke ich, dass Sie wahrscheinlich den Abschnitt über Verzweigungen im Subversion-Buch lesen sollten . Sehen Sie sich insbesondere den Abschnitt "Repository-Layout" unter Zweigwartung und allgemeine Zweigmuster an .


3

Die Alternative, die ich hier nicht sehe, ist eine "Branch on Change" -Philosophie.

Was ist, wenn Ihr Kofferraum die "aktuelle Version" ist, anstatt Ihren Kofferraum im "Wilden Westen" zu haben? Dies funktioniert gut, wenn jeweils nur eine Version der Anwendung veröffentlicht wird, z. B. eine Website. Wenn eine neue Funktion oder Fehlerbehebung erforderlich ist, wird eine Verzweigung erstellt, um diese Änderung zu speichern. Dies ermöglicht häufig die Migration der Fixes zur individuellen Veröffentlichung und verhindert, dass Ihre Cowboy-Codierer versehentlich eine Funktion zur Veröffentlichung hinzufügen, die Sie nicht beabsichtigt haben. (Oft ist es eine Hintertür - "Nur zum Entwickeln / Testen")

Die Hinweise von Ben Collins sind sehr nützlich, um festzustellen, welcher Stil für Ihre Situation gut geeignet ist.


4
Früher hatten wir dieses Modell, aber das ständige Zusammenführen von Änderungen aus den Zweigen erwies sich als unerschwinglich komplex. Jetzt verwenden wir Stamm für die Blutungskante und Äste für die Stabilisierung und Wartung. Auf diese Weise ist kein Zusammenführen von Bäumen erforderlich.
Joeri Sebrechts


3

Gnat hat diese hervorragende Aufschlüsselung der verschiedenen Ratschläge geschrieben, die Sie zu Verzweigungsstrategien finden können.

Es gibt keine einzige Verzweigungsstrategie, sondern das, wofür funktioniert:

  • Ihre Teamgröße
  • Ihr Produkt und die Lebenszykluszeiten
  • Die Technologie, die Sie verwenden (Web, Embedded, Windows Apps)
  • Ihre Quellcodeverwaltung, zB Git, TFS, Hg

Jeff Atwoods Beitrag bietet viele Möglichkeiten. Ein weiteres Element ist das Konzept der Werbung (aus dem Link von Ryan Duffield). In diesem Setup haben Sie einen Entwicklungszweig, einen Testzweig und einen Freigabezweig. Sie fördern Ihren Code, bis er den Release-Zweig erreicht und bereitgestellt wird.


2

Wir haben derzeit eine Niederlassung für die laufende Wartung, eine Niederlassung für "neue Initiativen", was nur "Dinge bedeutet, die irgendwann in der Zukunft herauskommen werden; wir sind uns nicht sicher, wann". Gelegentlich gab es auch zwei Wartungszweige: einen zur Behebung der derzeit in Produktion befindlichen und einen noch in der Qualitätssicherung befindlichen.

Der Hauptvorteil, den wir gesehen haben, ist die Fähigkeit, schneller auf Benutzeranfragen und Notfälle zu reagieren. Wir können das Update für den in Produktion befindlichen Zweig durchführen und freigeben, ohne zusätzliche Elemente freizugeben, die möglicherweise bereits eingecheckt wurden.

Der Hauptnachteil besteht darin, dass wir am Ende viel zwischen Zweigen zusammenführen, was die Wahrscheinlichkeit erhöht, dass etwas übersehen oder falsch zusammengeführt wird. Bisher war das kein Problem, aber es ist definitiv etwas zu beachten.

Bevor wir diese Richtlinie eingeführt haben, haben wir im Allgemeinen die gesamte Entwicklung im Trunk durchgeführt und erst verzweigt, als wir Code veröffentlicht haben. Wir haben dann nach Bedarf Korrekturen an diesem Zweig vorgenommen. Es war einfacher, aber nicht so flexibel.


2

Jeff Atwood schrieb darüber in einem guten Blog-Beitrag; Dieser Beitrag enthält einige wichtige Links.


1

Die Philosophie, die wir bei der Arbeit verfolgen, ist es, den Kofferraum in einem Zustand zu halten, in dem Sie jederzeit schieben können, ohne die Baustelle drastisch zu beschädigen. Dies bedeutet nicht, dass der Kofferraum immer in einem perfekten Zustand ist. Es wird natürlich Fehler geben. Aber es geht darum, es niemals drastisch kaputt zu machen.

Wenn Sie eine Funktion hinzufügen möchten, verzweigen Sie. Eine Designänderung, Zweig. Es gab so viele Male, in denen ich dachte: "Oh, ich kann das einfach im Kofferraum machen, es wird nicht so lange dauern", und dann 5 Stunden später, als ich den Fehler nicht herausfinden kann, der die Dinge kaputt macht, die ich mache wünschte wirklich, ich hätte mich verzweigt.

Wenn Sie den Kofferraum sauber halten, haben Sie die Möglichkeit, Fehlerbehebungen schnell anzuwenden und zu veröffentlichen. Sie müssen sich keine Sorgen um den fehlerhaften Code machen, den Sie bequem abzweigen.


0

Dies hängt davon ab, welches Versionskontrollsystem Sie verwenden. Jedes VCS hat unterschiedliche Ansätze zur Verzweigung.

Welchen VSC verwenden Sie?


Während das Versionskontrollsystem möglicherweise bestimmt, wie Sie verzweigen, bestimmt es nicht unbedingt Ihre Verzweigungsstrategie. Um Ihre Frage zu beantworten, verwenden wir Subversion.
Craig H

1
Ich bin mir nicht sicher, ob das in der Praxis ganz stimmt. Git fördert praktisch die Verzweigung, da dies eine einfache und schnelle Operation ist und relativ einfach zusammengeführt werden kann. In CVS ist es viel schwieriger. Keine Verzweigung zu machen, weil es harte Arbeit ist, würde Teil einer Verzweigungsstrategie sein.
Stephen Darlington

0

Für Subversion stimme ich dem Kommentar von Ryan Duffield zu. Das Kapitel, auf das er sich bezieht, bietet eine gute Analyse des zu verwendenden Systems.

Der Grund, den ich gefragt habe, ist, dass Perforce eine völlig andere Möglichkeit bietet, Zweige aus SVN oder CVS zu erstellen. Außerdem gibt es alle DVCSs, die eine eigene Philosophie für die Verzweigung haben. Ihre Verzweigungsstrategie hängt davon ab, welche Tools Sie verwenden.

Zu Ihrer Information , Svnmerge.py ist ein Tool zum Zusammenführen von Zweigen in SVN. Es funktioniert sehr gut, solange Sie es häufig (alle 10-30) festschreiben, da sonst das Tool verwirrt werden kann.


0

Unabhängig davon, welches Verzweigungsmuster gewählt wurde, sollten Sie versuchen, Ihre Zweige in einer binären Baumform wie folgt zu halten:

   trunk - tags
     |
    next
   /  \  \
bugfix  f1  f2
        /   \  \          
       f11    f21 f22
  • Untergeordnete Knoten sollten nur mit dem direkten übergeordneten Knoten zusammengeführt werden.
  • Versuchen Sie am besten, nur den gesamten Zweig mit dem übergeordneten Zweig zusammenzuführen. Führen Sie niemals Unterordner innerhalb eines Zweigs zusammen.
  • Sie können bei Bedarf Commits auswählen, solange Sie nur den gesamten Zweig zusammenführen und auswählen.
  • Der nächste Zweig in der obigen Abbildung dient nur zur Veranschaulichung. Möglicherweise benötigen Sie ihn nicht.
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.