Was verkürzt den Software-Release-Zyklus mit DVCS im Vergleich zu CVCS?
Ich stimme Bart zu, dass der Hauptgrund das verwendete Verzweigungsmodell ist, aber die Art des Versionskontrollsystems beeinflusst direkt, welche Verzweigungsmodelle realisierbar sind. Wir haben also zwei Unterfragen. Welches Verzweigungsmodell unterstützen die verteilten Systeme besser und warum beschleunigt es den Release-Zyklus?
Der grundlegende Unterschied zwischen zentraler und verteilter Versionskontrolle besteht darin, dass Sie ohne zentrale Autorität keine lineare Zeitachse erzwingen können. Um eine verteilte Versionskontrolle zu ermöglichen, mussten diese Systeme den Verlauf notwendigerweise als gerichteten azyklischen Graphen definieren, wobei jede Revision lediglich eine eindeutige Kennung, eine oder mehrere übergeordnete Revisionen und möglicherweise beliebig viele untergeordnete Revisionen aufweist, die Sie möglicherweise gar nicht kennen, weil Sie haben noch nicht mit dem System synchronisiert, auf dem sie erstellt wurden.
Es stellt sich heraus, dass sich dieser Ansatz sehr gut zur Verzweigung eignet. Sie müssen nichts tun, um einen Zweig zu bekommen, Sie haben einfach immer einen. So können Sie direkt mit dem Kopf voran zur Arbeit tauchen und entscheiden, wann und wo es zusammengeführt werden soll oder wo und unter welchem Namen es aufbewahrt werden soll, bis Sie wissen, ob es tatsächlich so läuft, wie Sie es benötigen.
Im Gegensatz dazu pflegen alle zentralisierten Systeme die Historie als Satz von Zweigen mit linearer Abfolge von Revisionen. Sie müssen also im Voraus entscheiden, ob Sie einen Zweig benötigen, ihm einen Namen geben und ihn explizit erstellen. Das ist ziemlich nervig, wenn Sie noch nicht wissen, was die Idee wert ist, und das oft einfach nicht wissen, bevor Sie mit dem Programmieren beginnen. Erschwerend kommt hinzu, dass in den meisten zentralisierten Systemen die Filialnamen global, signifikant, häufig persistent und nicht leicht zu ändern sind, während sie in allen wichtigen verteilten Systemen nur lokale Moniker sind, die nach Belieben geändert und frei recycelt werden können. Und durch die Tatsache, dass alle Verzweigungs- und Zusammenführungsvorgänge in CVCS normalerweise etwas langsamer sind.
Somit erleichtert DVCS Verzweigungen und daher werden Teams, die DVCS-Zweige verwenden, ständig verwendet, während Teams, die CVCS verwenden, diese die meiste Zeit meiden.
Warum ermöglicht die Verwendung von Zweigen häufigere Releases? Nun, jedes Team wird ab und zu eine Aufgabe unterschätzen, oft wenn ein schwer zu verfolgender Fehler auftritt. Teams, die zentralisierte Systeme verwenden, führen normalerweise das gesamte Debugging und die meisten Entwicklungen im Trunk durch, da Zweige unpraktisch sind. Sie können also erst freigeben, wenn sie die meisten Fehler beseitigt haben und die Entwicklungs- und Debugging-Phasen verschachteln müssen.
Im Gegensatz dazu können in verteilten Systemen, in denen alle Arbeiten an Zweigen ausgeführt werden, diese zum Testen zusammengeführt, getestet, Fehler behoben und nur die Arbeit, die Tests besteht, separat mit dem Trunk zusammengeführt werden. Dies führt zu einem Stamm, der nur sehr wenige Fehler aufweist und daher häufiger freigegeben werden kann, normalerweise immer dann, wenn ein wichtiges Feature landet.
Es hilft auch, dass bei einer Änderung der Prioritäten die laufenden Arbeiten mit dem bei verteilten Systemen verwendeten Verzweigungsansatz trivial zurückgestellt werden können. In den meisten realen Projekten ändern sich die Prioritäten ständig.