Zweige

13.06.2007 Permalink

Heute hatte ich wieder mal ein Interview. Unter anderem hatten wir das Thema Qualität und Versionsverwaltung am Wickel. Als es um Branches ging, die eigentlich jedes bessere Versionsverwaltungssystem anbietet, wurde es schwierig. Warum brauche ich sowas? Und zu welchem Zeitpunkt verzweige ich gezielt? Und was mache ich mit dem Zweig?

Da ich mich erinnere, dass mir das vor einigen Jahren auch alles mysteriös erschien, hier mal ein paar klare Ansagen:

Ein Branch dient grundsätzlich der Entkopplung parallel laufender Arbeiten in einem Software-Team. Es gibt ihn in zwei Geschmacksrichtungen.

Einen Isolation-Branch brauche ich, wenn einige Kollegen bewusst eine "größere Baustelle" aufreißen, dabei für mehrere Tage ungestört sein müssen und den Rest des Teams ihrerseits von den Nebenwirkungen der Umbauarbeiten verschonen wollen. Ein Isolation-Branch wird nach getaner Arbeit zurückgeführt (merge).

Einen Release-Branch brauche ich, wenn das Team aus Zeitgründen während des Bugfixing parallel Weiterentwicklung betreibt. Nach dem Feature-Freeze und vor dem nächsten neuen Feature verzweigt man. Bugfixing geschieht nun auf dem Release-Branch, die Bugfixes werden i.d.R. auf die Mainline "runtergezogen". Ein Release-Branch als ganzes wird dagegen nicht mehr zurückgeführt. Auf diese Weise stabilisiert sich das System auf dem Abzweig, während durch Weiterentwicklung auf dem Hauptzweig wahrscheinlich wieder Fehler dazukommen.

Ich kann Isolation-Branches sogar auf einem Release-Branch haben, das sollte allerdings eine Ausnahme sein, da "größere Baustellen" während der Stabilisierung ein ganz übles Zeichen für die Gesamtverfassung der Codebasis sind. Umgekehrt macht die Kombination -- soweit ich das überschaue -- gar keinen Sinn.

Es ist eine tolle Sache, Isolation-Branches nach der Aufgabe oder dem passenden Arbeitspaket, das diese Isolation erfordert, zu benennen, Release-Branches hingegen nach der Major.Minor-Version (d.h. release_Major.Minor), so dass einzelne Tags, die ja genau einen Schnappschuss darstellen, z.B. als letzte Stelle der Versionsnummer die Buildnummer kriegen (d.h. release_Major.Minor.Buildnummer).

Wer Subversion kennt, der weiß, dass Branches und Tags technisch das gleiche sind. Das bietet die angenehme Flexibilität, aus Tags mit zwei Handgriffen wiederum Branches zu machen. Klingt etwas überflüssig, in stressigen Situationen aber, in denen hektisches Bugfixing zur Verschlimmerung führt und das Release -- koste es, was es wolle -- unbedingt jetzt aus der Tür muss, da ist der Tag vom letztbesten Stand Gold wert, und jede Fehlerbehebung zur Produktionsstabilisierung kann auf dem von dort kopierten Branch stattfinden. So ein Manöver sollte ganz sicher auch die Ausnahme sein, aber es ist beruhigend zu wissen, dass man kann, wenn man muss.

Nachlesen kann man das alles natürlich auch ausführlich, z.B. hier:

Viel Spaß beim Verzweigen!