Eine Frage die immer wieder in Erstgesprächen zu einem Git oder Subversion Handbuch mit einem maßgeschneiderten Workflow auftaucht ist: Wo liegt der Unterschied zwischen SVN/Subversion und Git? Meist zielt die Frage nicht auf die technischen Details, sondern auf die Auswirkungen bei der täglichen Arbeit. Häufig sind die Vorteile die Git bei verteilten (evtl. internationalen) Teams bietet für den Fragesteller nicht direkt ersichtlich. Auf Grund der aktuellen Situation arbeiten mehr Menschen als je zuvor Remote und nicht mehr direkt am Firmenarbeitsplatz. Und damit gibt es automatisch mehr “neue” verteilte Teams. Deshalb will ich die Vorteile die Git in der Softwareentwicklung bietet hier etwas näher erläutern.
Die für die Entscheidung zwischen den beiden Tools wichtigsten Fakten sind:
SVN | Git | |
Repository | zentral | dezentral |
Branching | verzeichnis-basiert | zeiger-basiert |
Netzwerkverbindung | für jede Aktion benötigt | Nur für “Push” und “Pull” |
Zentral vs. Dezentral
Da ein Git Repository dezentral organisiert ist, hat jeder Entwickler das komplette Repository lokal auf seinem PC. Damit hat automatisch jeder Entwickler ein komplettes Backup des Git Repositories. Allerdings wird dadurch auch entsprechend Speicher verbraucht. Zu Zeiten sinkender Hardwarepreise spielt dies aber eine immer kleinere Rolle.
Netzwerkverbindung
Ein großer Vorteil, dass Git nur für sog. Push und Pull Operationen eine Netzwerkverbindung benötigt hängt direkt mit der dezentralen Struktur zusammen. Da alle Operationen wie Ändern, Committen, Löschen von Dateien, History ansehen, Branching… lokal durchgeführt wird, benötigt git für diese Operationen KEINE Netzwerkverbindung. Dadurch werden diese auch erheblich schneller als bei SVN durchgeführt – gefühlt gibt es keine Wartezeit, wenn die Repositories nicht extrem groß sind. Ein Entwickler kann auch bei einer sehr instabilen Netzwerkverbindung vernünftig arbeiten und einfach 1-2 mal pro Tag einen Push/Pull durchführen und die Änderungen zum Git Server übertragen.
Branching
Für den Workflow der Entwickler ist die Einfachheit mit der Branches erzeugt, gemerged und auch geprüft werden können v.a. beim agilen Arbeiten von entscheidender Bedeutung. Hier spielt git einen weiteren aus meiner Sicht häufig unterschätzten Vorteil aus: Alle Branching Operationen gehen bei Git unglaublich leicht von der Hand. Da Git Branches ein Zeiger auf einen bestimmten Commit darstellen, ist das Branching sehr intuitiv und viele Fehler die bei SVN passieren können sind bei Git gänzlich ausgeschlossen.
Um in Git von einem Branch zum anderen zu wechseln ist nur ein “git checkout BRANCHNAME” nötig – egal in welchem (Unter-) Verzeichnis. Ein neuer Branch wird mit git checkout -b BRANCHNAME” erzeugt:
Das Wechseln zurück zum Master Branch geht ebenfalls sehr einfach:
Und die Änderungen sind mit einem einfachen git merge stage wieder zurückgemerged:
Ich kann jedem nur empfehlen ein lokales Git Repository zum testen anzulegen – wie einfach das Branchen / Mergen usw. von der Hand geht, merkt man erst, wenn man es ausprobiert.
Natürlich ist git auch in die üblichen Entwicklungsumgebungen integriert bzw. kann mit graphischen Tools wie z.B. TortoiseGit bedient werden.