Wann sollten Sie verzweigen?

107

Wann sollten Sie bei der Arbeit mit einem SCM-System verzweigen?

Ben Aston
quelle

Antworten:

59

Es gibt verschiedene Verwendungszwecke für die Verzweigung. Eine der häufigsten Anwendungen ist das Trennen von Projekten, die früher eine gemeinsame Codebasis hatten. Dies ist sehr nützlich, um mit Ihrem Code zu experimentieren, ohne die Hauptleitung zu beeinträchtigen.

Im Allgemeinen werden zwei Verzweigungstypen angezeigt:

  • Feature-Zweig: Wenn ein bestimmtes Feature so störend ist, dass nicht das gesamte Entwicklungsteam in einem frühen Stadium betroffen sein soll, können Sie einen Zweig erstellen, in dem diese Arbeit ausgeführt werden kann.

  • Fixes Branch: Während die Entwicklung auf dem Haupt-Trunk fortgesetzt wird, kann ein Fixes Branch erstellt werden, um die Fixes auf die neueste veröffentlichte Version der Software zu speichern.

Möglicherweise möchten Sie den folgenden Artikel lesen, in dem die Prinzipien der Verzweigung und deren Verwendung erläutert werden:

Daniel Vassallo
quelle
Ich habe noch nie von der von Ihnen erwähnten allgemeinen Verwendung gehört oder daran gedacht, aber das ist eine wirklich coole Idee. Ich könnte das wirklich im kommenden Projekt verwenden. Vielen Dank für den Hinweis.
Nils Riedemann
82

In allgemeiner Begriff, der Hauptzweck der Verzweigung (a VCS - Version Control System - Funktion) ist Code zu erreichen Isolation .

Sie haben mindestens einen Zweig, der für die sequentielle Entwicklung ausreichen kann und für viele Aufgaben verwendet wird, die in demselben eindeutigen Zweig aufgezeichnet (festgeschrieben) werden.

Aber dieses Modell zeigt schnell seine Grenzen:

Wenn Sie Entwicklungsaufwand haben (Refactoring, Evolution, Fehlerbehebungen, ...) und feststellen, dass Sie diese Änderungen nicht sicher in demselben Zweig wie in Ihrem aktuellen Entwicklungszweig vornehmen können (weil Sie die API beschädigen oder Code einführen würden, der fehlerhaft wäre alles), dann müssen Sie einen weiteren Zweig.
(Um diesen neuen Code für den alten zu isolieren , obwohl die beiden Codesätze später zusammengeführt werden)

Das ist also genau dort Ihre Antwort:
Sie sollten verzweigen, wenn Sie nicht zwei Entwicklungsbemühungen in einem Zweig verfolgen und aufzeichnen können.
(ohne eine schrecklich komplizierte Geschichte zu pflegen).


Ein Zweig kann nützlich sein, selbst wenn Sie der einzige sind, der am Quellcode arbeitet, oder wenn Sie viele sind.
Sie sollten jedoch nicht "einen Zweig pro Entwickler" erstellen :
Der Zweck "Isolierung" besteht darin, einen Entwicklungsaufwand zu isolieren (eine Aufgabe, die so allgemein sein kann wie "Lassen Sie uns die nächste Version unserer Software entwickeln" oder so spezifisch wie "Lassen Sie uns beheben" Fehler 23 "),
um eine" Ressource "nicht zu isolieren .

(Ein Zweig namens "VonC" bedeutet für einen anderen Entwickler nichts: Was ist, wenn "VonC" das Projekt verlässt? Was sollen Sie damit machen?
Ein Zweig namens "bugfix_212" kann beispielsweise im Kontext eines Bug-Tracking-Systems interpretiert werden und jeder Entwickler kann es mit zumindest einer Vorstellung davon verwenden, was er damit machen soll)

Ein Zweig ist kein Tag (SVN ist ein Revisionssystem, das versucht, Versionsfunktionen wie das Verzweigen und Markieren von Verzeichnissen mit billiger Dateikopie vorzuschlagen. Dies bedeutet nicht, dass ein Tag ein Zweig ist.)

Um einen Zweig zu definieren, müssen Sie auch einen Zusammenführungsworkflow definieren : Sie müssen wissen, wo Sie Ihren Zweig zusammenführen müssen, wenn Sie damit fertig sind.
Dafür ist das Kapitel 7 von Practical Perforce (Laura WINGERD - O'Reilly) eine gute Einführung (VCS-Agnostiker), um den Workflow zwischen verschiedenen Arten von Zweigen zusammenzuführen: "" Wie sich Software entwickelt "(pdf)

Es definiert den Begriff Codeline (Zweig, der wichtige Entwicklungsschritte des Codes aufzeichnet, entweder durch Tags an bestimmten Punkten oder durch wichtige Zusammenführung zum Zweig).

Es führt das Hauptlinienmodell (eine zentrale Codeline zum Aufzeichnen von Veröffentlichungen) ein und beschreibt verschiedene Zwecke für die Verzweigung:

  • Aktive Entwicklungsströme : Eine beständige Codeline, wenn nacheinander verschiedene Entwicklungen stattfinden
  • Aufgabenzweige : Kurzlebige Zweige für spezifischere Aufgaben (Fehlerbehebung ist ein klassischer Zweig, aber Sie können auch einen Zweig für einen Zusammenführungsaufwand definieren, von dem Sie wissen, dass er komplex zu erledigen ist: Sie können diesen Aufgabenzweig zusammenführen, festschreiben und testen ohne Probleme für den aktuellen Hauptentwicklungszweig einzuführen)
  • Staging-Zweig : Zum Vorbereiten einer Version mit einigen vorproduktionsspezifischen Daten oder Konfigurationsdateien.
  • Private Niederlassungen, Ad-hoc-Niederlassungen und spärliche Niederlassungen : Für sehr kleine Aufgaben, nur um einige laufende Arbeiten ausführen zu können, ohne auf den formellen Abschluss oder die Prüfung warten zu müssen.
    Das erlaubt es, "früh zu begehen, oft zu begehen".

Andere interessante Konzepte rund um VCS: Grundlegende Konzepte
(ursprünglich über ClearCase, aber auch für jedes VCS gültig)

VonC
quelle
19

Alle SCMs des 21. Jahrhunderts sagen Ihnen:

Verzweigen Sie für jede Aufgabe, an der Sie arbeiten müssen , unabhängig davon, ob es sich um eine neue Funktion, einen Bugfix oder einen Test handelt. Dies wird als Themenzweig bezeichnet und ändert die Art und Weise, wie Sie mit Ihrem SCM arbeiten.

Du erhältst:

  • Bessere Isolation
  • Bessere Rückverfolgbarkeit -> Sie ordnen Aufgaben Zweigen zu, nicht einzelnen Änderungssätzen. Dadurch können Sie beliebig oft festschreiben und legen kein Limit wie "ein Einchecken pro Aufgabe" fest.
  • Aufgaben sind unabhängig (normalerweise ausgehend von einer stabilen Grundlinie, sodass Sie sich nur auf Ihren Code konzentrieren, nicht auf die Behebung von Fehlern Ihrer Mitarbeiter), und Sie können wählen, ob Sie sie irgendwann oder später integrieren möchten, aber sie sind immer unter Versionskontrolle
  • Sie können den Code einfach überprüfen (über die Versionskontrolle, nicht vor dem Festschreiben von Bullshit), bevor Sie die Hauptzeile erreichen

Tools, die das können:

Tools, die das nicht können:

  • SVN
  • CVS
  • VSS
  • TFS
  • Perforce
Pablo
quelle
1
Warum kannst du das nicht mit SVN machen?
yegor256
4
SVN ist keine gute Zusammenführung. Aufgrund mangelnder ordnungsgemäßer Nachverfolgung der Zusammenführung. Auch weil das Erstellen einer Filiale nicht so billig ist wie die, auf die ich hingewiesen habe, ist es unter realen Bedingungen ein Albtraum.
Pablo
Bessere Rückverfolgbarkeit: Warum sollten Sie so oft festlegen, wie Sie möchten? Ist nicht einmal pro Aufgabe genug, wenn die Aufgabe keine komplizierte Funktion ist? Auch Fehler von Leuten können leicht ihren Weg zum Hauptzweig finden und ihn nicht "stabil" und nicht "sicher" machen, genau in dem Moment, in dem sie zusammengeführt werden.
Paiman Samadian
@PaimanSamadian: "Ist nicht einmal pro Aufgabe genug, wenn die Aufgabe keine komplizierte Funktion ist?" Sicher. Aus dem gleichen Grund, wenn die Aufgabe ist kompliziert, man begehen ist nicht genug ( befehle ich alle paar Minuten , wenn die Dinge gut laufen). Warum ein Commit pro Aufgabe erzwingen? • "Auch Bugs von Leuten können leicht zum Hauptzweig gelangen" Eigentlich nicht. Ein Teil des Funktionszweigs eines Feature-Zweigs besteht darin, dass er die Überprüfung und Prüfung von Code ermöglicht, bevor der Code in den Hauptzweig eingefügt wird.
Marnen Laibow-Koser
1
@PaimanSamadian Multiple Checkins sind großartig, um Zwischenänderungen zu erklären und die Überprüfung zu vereinfachen. Wenn Sie ein paar Stunden an etwas arbeiten, sind mehrere Checkins großartig.
Pablo
8

Dies hängt auch vom verwendeten SCM-Tool ab. Moderne SCMs (Git, Mercurial usw.) machen es immer einfacher, Zweige bei Bedarf zu erstellen und zu zerstören. Auf diese Weise können Sie beispielsweise einen Zweig pro Fehler erstellen, an dem Sie arbeiten. Sobald Sie Ihre Ergebnisse in den Trunk zusammenführen, verwerfen Sie den Zweig.

Andere SCMs, zum Beispiel Subversion und CVS, haben ein viel "schwereres" Verzweigungsparadigma. Das heißt, ein Zweig wird nur für etwas größer als ein Patch mit zwanzig Zeilen als geeignet angesehen. Dort werden Zweige klassisch verwendet, um ganze Entwicklungsspuren wie eine frühere oder zukünftige Produktversion zu verfolgen.

Fred
quelle
5

Wenn Sie signifikante und / oder experimentelle Änderungen an Ihrer Codebasis vornehmen müssen, insbesondere wenn Sie Zwischenänderungen vornehmen möchten, ohne die Amtsleitung zu beeinträchtigen.

Dominic Rodger
quelle
5

Dies hängt davon ab, welche Art von SCM Sie verwenden.

In den neueren verteilten Versionen (wie Git und Mercurial) erstellen Sie ständig Zweige und werden trotzdem neu zusammengeführt. Ich arbeite oft eine Weile an einem separaten Zweig, nur weil jemand den Build auf der Hauptleitung unterbrochen hat oder weil das Netzwerk ausgefallen ist, und füge dann Änderungen später wieder zusammen, wenn sie behoben sind, und es ist so einfach, dass es nicht einmal ärgerlich ist .

Das Dokument (kurz und lesbar), das mir am meisten geholfen hat zu verstehen, was in den verteilten Systemen vor sich ging, ist: UnderstandingMercurial .

In den älteren Systemen mit einem zentralen Repository (wie CVS, SVN und ClearCase) ist es ein viel schwerwiegenderes Problem, das auf Teamebene entschieden werden muss, und die Antwort sollte eher lauten: "Eine alte Version beibehalten, während dies zulässig ist." Entwicklung auf der Hauptstrecke "oder" als Teil eines großen Experiments "fortzusetzen.

Das verteilte Modell ist viel besser, denke ich, und es fehlen nur nette grafische Werkzeuge, um das vorherrschende Paradigma zu werden. Es ist jedoch nicht so weit verbreitet und die Konzepte sind unterschiedlich, so dass es für neue Benutzer verwirrend sein kann.

John Lawrence Aspden
quelle
3

Ich finde den Rat von Laura Wingerd & Christopher Seiwald bei Perforce wirklich prägnant und nützlich:

* Branch only when necessary.
* Don't copy when you mean to branch.
* Branch on incompatible policy.
* Branch late.
* Branch, instead of freeze.

Unter http://www.perforce.com/sites/default/files/pdf/perforce-best-practices.pdf finden Sie eine detaillierte Erläuterung der einzelnen Methoden und anderer bewährter Methoden.

Lester Cheung
quelle
3
Früher sagten P4-Leute das, aber heutzutage sagt ihr Marketing etwas anderes. Sie haben jahrelang versucht, Verzweigungen zu vermeiden, einfach weil sie Aufgaben- oder Themenverzweigungen nicht so gut ausführen können wie andere Systeme wie Git
pablo
Antwort im Jahr 2015! Der Grund für die Vermeidung von Verzweigungen besteht darin, dass keine Zusammenführung erforderlich ist - nicht, weil Perforce keinen Aufgaben- / Themenzweig hatte (Sie können "Aufgabenverzweigung" in Streams durchführen - in Perforce nennen wir dies "Aufgabenströme". Wie andere bereits erwähnt haben - Verzweigung ist in DVCS impliziert und die Frage wird respektlos. Ich denke, die Diskussion sollte sich nur auf Tools beschränken, die auf Client-Server-Weise funktionieren. Oder DVCS wird zentral verwendet (seit der Version 2015.1 können Sie Perforce in einem DVCS-Modus verwenden - das Beste aus beiden Welten).
Lester Cheung
2

Es gibt verschiedene Zwecke für die Verzweigung:

  1. Feature / Bug-Zweige. Dynamische und aktive Zweige, die nach Abschluss der Funktion / des Bugfixes wieder in den Trunk verschoben werden.
  2. Statische Verzweigungen (Tags in Subversion, obwohl im Wesentlichen nur eine "normale Verzweigung"). Sie bieten eine statische Momentaufnahme von beispielsweise einer Veröffentlichung. Obwohl sie bearbeitet werden könnten , bleiben sie unberührt.
Wim Hollebrandse
quelle
1

Die Notwendigkeit einer Verzweigung kann auch auftreten:

  • Wenn Sie einem bestimmten Kunden einen Hotfix bereitstellen möchten (z. B. wichtig) und nicht sicher sind, ob der Fix Teil zukünftiger Versionen sein wird

  • Sateesh
    quelle
    1

    Wann immer Sie Lust dazu haben.

    Sie werden wahrscheinlich nicht sehr häufig arbeiten, wenn Sie mit einem zentralisierten SCM arbeiten, da die Zweige Teil des offiziellen Repositorys sind, und das lädt nicht wirklich zum Experimentieren ein, ganz zu schweigen davon, dass Zusammenführungen wirklich weh tun.

    OTOH, es gibt keinen technischen Unterschied zwischen einer Filiale und einer Kaufabwicklung in verteilten SCMs, und Zusammenführungen sind viel einfacher. Sie werden viel häufiger Lust haben, sich zu verzweigen.

    nur jemand
    quelle
    0

    Wenn Sie basierend auf Ihrem aktuellen Zweig Änderungen vornehmen müssen, die nicht für die nächste Version dieses Zweigs bestimmt sind (und nicht vorher).

    Zum Beispiel arbeiten wir normalerweise am Kofferraum. Ungefähr zum Zeitpunkt der Veröffentlichung muss jemand eine Änderung vornehmen, die wir in der aktuellen Version nicht möchten (möglicherweise vor der Veröffentlichung, im Moment normalerweise nach der Veröffentlichung). Dies ist der Zeitpunkt, an dem wir verzweigen, um die Version in eine eigene Verzweigung zu stellen und die Entwicklung für die nächste Version auf Trunk fortzusetzen.

    Andrew Aylett
    quelle
    0

    Alle technischen Details beiseite lassen .....

    Verzweigen Sie, wenn Sie wissen, dass es einfacher ist, wieder zusammenzuführen!

    Beachten Sie, dass die Zusammenführung immer davon abhängt, wie die Arbeit in einem Projekt ausgeführt wird.

    Sobald dies erreicht ist, werden alle anderen tertiären Themen ins Spiel kommen.

    Syed M Shaaf
    quelle