Ein Versionskontrollsystem ist bei der Softwareentwicklung unumgänglich. Niemand sollte Software programmieren dürfen, ohne eine funktionierende Versionskontrolle zur Verfügung zu haben, denn sie wird früher oder später deine geistige Gesundheit retten. Sehen wir uns an, was ein Versionskontrollsystem wie Git ist.
Stell dir vor, du schreibst ein Buch Stell dir darüber hinaus vor, du hast ein Kapitel fertig geschrieben und hast nach einiger Zeit – wie das bei einem kreativen Schaffensprozess ist – das Kapitel vollständig überarbeitet. Kein Stein ist auf dem anderen geblieben. Aber wie es das Schicksal so will, fällt dir nach ein paar Wochen auf, dass die erste Version des Kapitels die bessere war. Wie erhalte ich denn nun diesen Stand wieder zurück? Hast du von Anfang an ein Versionskontrollsystem (VCS) eingesetzt, ist das kein Problem und kostet dich ein paar Knopfdrücke. Ohne eine Versionskontrolle musst du die Inhalte aus deiner Erinnerung ziehen, was nicht nur mühsam, sondern auch langwierig und teuer ist.
Was beim Schreiben so klappt, funktioniert auch bei anderen Schaffensprozessen, wie auch dem Programmieren. Eine Versionsverwaltung führt Buch über die Veränderungen innerhalb einer Datei. Dank der Versionskontrolle brauchst du nicht mehr den auskommentierten Code über längere Zeit in den Dateien zu lassen, weil du glaubst, dass du die Codestellen später doch noch wieder brauchen könntest. Du kannst frisch und frei den Code nach Herzenslust walken und kneten, wie du willst. Rennst du in eine Sackgasse, kannst du einfach einen älteren, noch funktionierenden Stand wiederherstellen. Deine Versionsverwaltung ist deine Zeitmaschine, mit der du in die Vergangenheit einer Datei reisen kannst.
Es gibt unterschiedliche Arten von Versionskontrollsystemen, denen verschiedene Konzepte unterliegen. Die bekanntesten sind Subversion (SVN), Mercurial und Git. Das Sichern eines bestimmten Stands nennt man „Commit“.
Lokales Versionskontrollsystem
Viele Anwenderinnen und Anwender sichern unterschiedliche Versionen ihrer Dateien in Verzeichnissen. Sie machen das, wenn sie meinen, dass es dafür an der Zeit ist. So könnte ich beispielsweise einen Ordner anlegen und darin immer eine Kopie der Datei sichern, an der ich heute gearbeitet habe. An den Dateinamen der Kopie hänge ich immer das aktuelle Datum. So habe ich nach einiger Zeit ein lokales Versionskontrollsystem aufgebaut.
Die Probleme damit liegen auf der Hand: Manchmal vergesse ich das Sichern. Im Verzeichnis liegen bald so viele Dateien, dass der Überblick schwierig wird. Ich muss jede Datei einzeln öffnen, wenn ich einen bestimmten Stand suche. Verliere ich das Verzeichnis mit den ganzen Dateikopien, ist mein Versionskontrollsystem futsch, daher brauche ich also eine weitere Strategie, um Sicherheitskopien meines Versionenverzeichnisses zu erstellen; damit führe ich eine zusätzliche Komplexitätsstufe ein. Außerdem findet die lokale Versionsverwaltung ihre Grenzen bei der Zusammenarbeit mit anderen. Wie soll das auch funktionieren? Man müsste viele Absprachen treffen, an die sich alle halten. Es müsste ein gemeinsames Verzeichnis im Netzwerk geben …
Es wird klar: Bei wenigen Dateien, die sich selten ändern, mag die Strategie des lokalen Versionskontrollsystems funktionieren, aber eine verlässliche Arbeitsweise ist das nicht. Das muss besser gehen.
Zentralisiertes Versionskontrollsystem
Besser wird das tatsächlich mit zentralisierten Versionskontrollsystemen wie SVN oder dem inzwischen nicht mehr weiterentwickelten CVS. Hierbei gibt es einen Server, auf dem die „richtige“ Version einer Datei liegt. Wer an ihr arbeiten möchte, lädt sich die Datei auf den eigenen Rechner („check out“), bearbeitet sie und lädt sie anschließend wieder in die Versionsverwaltung. Administratorinnen und Administratoren können recht kleinteilig Rechte an die Anwenderinnen und Anwender des Versionskontrollsystems geben. Diese müssen beim Einchecken ihrer bearbeiteten Dateien darauf achten, dass es dabei keine Konflikte mit der Arbeit anderer Programmiererinnen und Programmierer entstehen. Falls es welche gibt, müssen diese augenblicklich beseitigt werden.
Auch wenn diese Art der Verwaltung eine erhebliche Verbesserung gegenüber der lokalen darstellt, gibt es auch hierbei große Probleme. Das augenscheinlichste ist der zentrale Server. Dessen Inhalt kann man zwar auf einen anderen Server sichern, aber sollte beispielsweise der Server für längere Zeit ausfallen, dann können Anwenderinnen und Anwender ihre Arbeit zum Teil nicht fortsetzen.
Verteiltes Versionskontrollsystem
An der notwendigen Verfügbarkeit eines zentralen Servers setzen Versionsverwaltungen wie Mercurial oder Git an. Git-Benutzerinnen und Git-Benutzer laden sich nicht den letzten Stand eines Projekts von einem Server, sondern sie bekommen das gesamte Repository und auch die gesamte Entwicklungshistorie. Somit haben alle eine Sicherheitskopie des Repositorys, falls mit dem Server etwas sein sollte. Außerdem werden alle Änderungen an den Daten des Repositorys lokal vorgenommen, was einen enormen Geschwindigkeitsvergleich bei der Arbeit mit dem Versionskontrollsystem zur Folge hat.
Bei der Konzeption von Git waren neben der verteilten Struktur Geschwindigkeit, effiziente Erstellung von Entwicklungszweigen („Branches“) und eine einfache Bedienung des eigentlichen Systems die Schlüsselelemente, die es einzuhalten galt.
Stand heute (2019) ist Git das meist verwendete Versionskontrollsystem.
Photo by Sarah Pflug from Burst