Allgemeines
Git ist ein version control system (VCS), welches 2005 von Linus Torvalds zur Entwicklung des Linux-Kernels ins Leben gerufen wurde. Es handelt sich dabei, im Gegensatz zu bspw. Apache Subversion, um ein verteiltes VCS. Es wird also nicht direkt an einem zentral gelagerten repository gearbeitet. Stattdessen wird vom remote repository eine lokale Kopie erstellt. Bearbeitet wird das local repository, das periodisch mit den Neuerungen im remote abgeglichen werden kann. Die lokalen Änderungen können auf das remote hochgeladen werden, wahlweise nachdem sie überprüft und gutgeheissen wurden.
Branches und commits
In aller Regel wird mit git in sog. branches gearbeitet. Diese repräsentieren einen gewissen, logischen Entwicklungsstrang. Ausserdem beinhalten sie eine Entwicklungsgeschichte, so dass sich Veränderungen inhaltlich und zeitlich zurückverfolgen lassen. Diese Veränderungen sind in sog. commits gebündelt, die Momentaufnahmen in Relation zum letzten commit darstellen. Branches sind hierarchisch geordnet und bilden einen Baum, an dessen Wurzel die ursprüngliche branch liegt, typischerweise - aber nicht zwingend - master oder main genannt. Es ist projektabhängig, wie viele branches existieren, welche Aufgaben sie haben, ob und wie sie fortgesetzt werden und in welchem Verhältnis sie zueinander stehen.
Gitflow
Es gibt verschiedene Methoden zur Organisierung und Verwaltung von branches. Diese spiegeln verschiedene Entwicklungsphilosophien, die Teamgrösse, die Anforderungen des Projekts und weitere Aspekte. Als Beispiel dient hier gitflow. Er war mal eine neuartige und sehr innovative Arbeitsweise, wurde in gewissen Kontexten aber von anderen abgelöst. Nichtsdestotrotz eignet sich der gitflow immer noch gut bei Projekten, in denen der code schon produktiv ist, unbedingt auch weiter funktionieren muss und deswegen eine strikte Kontrolle notwendig ist.
Im gitflow gibt es grundsätzlich zwei stetig fortlaufende branches:
Typischerweise wird am develop branch nicht direkt gearbeitet, sondern in Form von feature branches. Diese «Unteräste» sollen spezifische Funktionalitäten implementieren und können ihrerseits wieder branches haben. Nach der Implementation sind sie abgeschlossen und gehen wieder ganz im develop branch auf. release branches dienen dazu, die Übernahme von code aus dem develop in den master vorzubereiten und zu testen. Funktioniert alles wie vorgesehen, fliessen die release branches schliesslich in den master.
Folgendes Bild illustriert den Arbeitsablauf (Quelle):
Eine vereinfachte Version davon ist der feature branch-Workflow. Hier werden die feature branches direkt vom main/master abgespalten, was für kleinere Projekte ausreicht.
Dienstleistungen wie GitHub oder GitLab sowie Editoren und IDEs bieten GUIs für die Verwendung von Git. Oftmals ist es aber notwendig, git in der Kommandozeile zu verwenden, weswegen man damit zumindest ein wenig vertraut sein sollte. Es folgen in Grundzügen die wichtigsten Befehle, welche wir verwendet haben:
Bei einem merge wird eine branch abgeschlossen und fliesst wieder in die Mutterbranch. Wie oben angetönt, gibt es verschiedene Arten von merges, die sich in verschiedenen Situationen anbieten. Hier werden drei Typen kurz vorgestellt: