Erste Anfänge

Apples Xcode macht die Verwendung eines Versioning-Systems in Form von Git sehr einfach: Wird ein neues Projekt in Xcode angelegt, kann beim Auswählen des Speicherorts unter Source Control auch die Erzeugung eines Git-Repositorys aktiviert werden (Create Git repository on welches auch einen entfernten Server erlaubt, dazu weiter unten mehr). Vorhandene Git-Projekte, die entweder über Check out an existing project im Xcode Launchbildschirm oder über Source Control > Check Out... hinzugefügt werden, werden automatisch von Git erfasst.

Übliche Verwendung

Git lohnt sich immer zu verwenden. Werden größere Änderungen vorgenommen aber das Ergebnis gefällt nicht, erlaubt es Git, jederzeit alle Dateien zum letzten Speicherpunkt zurückzusetzen (Source Control > Discard All Changes...). Hat man Änderungen zufriedenstellend umgesetzt, kann ein neuer Speicherpunkt gesetzt werden indem alle Änderungen übergeben werden (Source Control > Commit...). Dabei bekommt man eine Auflistung aller Dateien, die seit dem letzten Speicherpunkt geändert wurden und kann die Änderungen zeilen- und zeichenweise nochmal durchgehen. Damit der Speicherpunkt von anderen unterschieden werden kann, muss man vor der Übernahme auch eine Beschreibung der Änderungen als commit message eintragen. Somit hat man mit Git ein lokales Versioning-System, den man über Source Control > History... verfolgen kann.

Ältere Projekte

Hat man ein Projekt ohne Git gestartet, kann man die Erzeugung eines lokalen Git-Repositorys leicht nachholen. Im terminal in das Stammverzeichnis des Projekts navigieren und folgenden Code ausführen:

git init
git add .
git commit -m "Mein erster Commit"

init verwandelt hierbei das aktuelle Verzeichnis in ein Git-Repository, add . fügt Dateien zu diesem Repository hinzu, wobei der Punkt gleichbedeutend für alle im Verzeichnis vorhandenen Dateien ist. Mit commit wird schließlich der aktuelle Stand der Dateien als Speicherpunkt übergeben.

Ist man nicht mit dem Terminal bewandert, bietet sich an, diesen aus dem Finder starten zu können. Dazu geht man in die Systemeinstellungen > Tastatur > Kurzbefehle > Dienste und aktiviert Neues Terminal beim Ordner. Nun hat man im Kontextmenü für die Verzeichnisse am eine eine Dienste-Eintrag, der diesen neuen Dienst enhält.

Dateien Ignorieren

Git erfasst standardmäßig alle Dateien. Mit Xcode fallen einige Datei darunter, die automatisch erstelllt werden und nicht dazu gedacht sind, mit anderen geteilt zu werden. Um Git diese Dateien ignorieren zu lassen, erstellen wir eine .gitignore im Stammverzeichnis des Projekts mit folgendem Inhalt:

build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate

Sind bereits einige dieser Dateien erfasst worden, sollten diese wieder entfernt werden. Zuerst müssen alle vorhandenen Änderungen commited werden. Danach geht es am schnellsten mit git rm -r --cached . gefolgt von git add ., wodurch die Liste der getrackten Dateien mit Berücksichtigung der .gitignore neu aufgebaut wird. Mit dem nächsten Commit werden diese Änderungen endgültig übernommen.

Entwicklungszweige

Will man mehrere größere Änderungen gleichzeitig vornehmen, die sich nicht gegenzeitig in die Quere kommen sollen, so bietet es sich an, mit jeweils einem separaten Entwicklungszweigen zu arbeiten. Unter Source Control > Projekttitel gibt es mit New Branch... einen neuen Zweig zu starten, mit Switch to Branch... zwischen mehreren Zweigen zu wechseln, sowie diese bei Fertistellung der Änderungen mit Merge from/into Branch wieder zusammenzuführen.

Dezentralisierung

Die eigentliche Stärke von Git entfaltet sich in der kolaborativen Arbeit, bei der Änderungen in der Gruppe regelmäßig ausgetauscht werden. Dazu bietet sich ein zentraler Git-Repository, ein sogenannter Remote, der von allen jederzeit erreibar ist, an. Remotes sind hierbei Internetadressen, die in der Regel auf projektname.git enden. Sie können einem Projekt über Source Control > Projekttitel > Configure... > Remotes > + hinzugefügt werden. Danach kann man mit Source Control > Push... eigene Änderungen auf dem Remote beziehungsweise mit Source Control > Pull... Änderungen von Anderen ins eigene Repository übernehmen.

Ein solcher Speicherort lässt sich einfach einrichten, sobald WebDAV oder SSH zur Verfügung steht. WebDAV wird vom populären GitHub sowie von vielen NAS-Servern unterstützt. Für Uberspace bietet sich z.B. der vorhandene SSH-Zugang an (eine Anleitung zur Einrichtung von WebDAV auf Uberspace folgt). Zum Teilen fängt man mit eine leeren Verzeichnis für das gemeinsam geteilte Git-Repository an:

mkdir MeinProjekt.git
cd MeinProjekt.git
git init --bare
git update-server-info

MeinProjekt wird damit der vorgeschlagene Verzeichnisname für das Projekt. Der komplette Pfad zur .git kann nun als Remote hinzugefügt werden. Der erste Push füllt diesen mit den gewünschten Daten. Man kann sich in Xcode mit der Erstellung eines neuen Projekts diesen Aufwand aber auch sparen und direkt bei Create Git repository on den entfernten Server angeben und dadurch das Remote erstellen lassen.