Neue Branches erstellen
In den vorangegangenen Artikeln dieser Reihe (siehe Linksammlung am Ende) haben wir die Grundlagen der Source Control kennengelernt. Dazu gehören das Erstellen eines lokalen Repositories sowie das Speichern und Verwerfen von Änderungen.
In diesem Teil der Reihe setzen wir uns nun nach Repository und Commit mit einem weiteren wichtigen Bestandteil von Git auseinander: dem sogenannten Branch.
Was ist ein Branch?
Einfach ausgedrückt enthält ein Branch eine Sammlung von Commits. Standardmäßig enthält jedes neue Xcode-Projekt auf Basis von Git einen solchen Branch. Der trägt den Titel master. Einsehen lässt sich der über den Source Control Navigator in Xcode. Dort finden sich innerhalb eines Repositories drei Ordner: Branches, Tags und Remotes. Unter Branches wird jener eben genannter master mit dem Zusatz (current) aufgeführt.

(current) gibt hierbei an, dass es sich bei dem zugehörigen Branch um den aktuell aktiven Branch handelt. Alle Commits, die in dem gezeigten Szenario innerhalb des zugrundeliegenden Projekts ausgeführt werden, landen somit im master-Branch.
Der große Vorteil der Source Control besteht darin, dass man beliebig viele weitere Branches für ein Repository erzeugen und fließend zwischen ihnen wechseln kann. Änderungen am Projekt landen dann nur in dem jeweils aktiven Branch und nicht in den anderen.
Das Nutzen mehrerer Branches ist beispielsweise sinnvoll, wenn man für eine bereits veröffentlichte App an einem neuen großen Feature arbeitet. Für dieses Feature könnte man einen neuen Branch erzeugen, in dem alle entsprechenden Anpassungen an der App vorgenommen werden. Parallel dazu kann man während dieser Entwicklungszeit die App über den ursprünglichen Branch durch kleine Bugfix-Änderungen aktuell halten.
Würde es in dem beschriebenen Szenario nur einen Branch und damit nur eine Code-Basis für alle Änderungen geben, müssten für die zwischendurch durchgeführten und veröffentlichten Bugfixes alle Änderungen für das große Feature rückgängig gemacht, auskommentiert oder anderweitig auf inaktiv gesetzt werden. So etwas wäre nicht nur mit enormen Aufwand verbunden, sondern auch immens fehleranfällig. Vergisst man beispielsweise auch nur eine bestimmte Funktion korrekt anzupassen, kann es im schlimmsten Fall zu vollkommen unvorhergesehenen Problemen kommen.
Und selbst wenn alles klappt, muss man nach Ausrollen des Bugfix-Updates wieder alle Feature-Änderungen einpflegen.
Zusammenführen von Branches
Doch womöglich fragt ihr euch gerade, was euch die zwei Branches nützen, wenn sich deren Code-Basis parallel weiter entwickelt und somit voneinander unterscheidet? Dann hat man auf der einen Seite die großen Änderungen für das neue Feature und auf der anderen Seite kleinere Bugfixes. Muss man den Code von einem Branch nun händisch in den anderen übertragen?
Nein, das gehört zu den enorm großen Vorteilen der Versionsverwaltung. Stattdessen kann man zu einem gegebenen Zeitpunkt – beispielsweise wenn das große neue Feature fertig und bereit für die Veröffentlichung ist – zwei Branches zusammenführen, indem man deren Inhalte mergt. Auf diese Art und Weise wandern die Änderungen eines Branches in einen anderen Branch, sodass letzterer beide Welten miteinander vereint. Diesen Aspekt bei der Arbeit mit Branches werden wir uns im kommenden Artikel dieser Reihe näher ansehen.
Neue Branches erstellen und auschecken
Um einen neuen Branch in Xcode zu erstellen wählt man zunächst einen bestehenden per Sekundärklick aus. Im sich öffnenden Kontextmenü findet sich dann ein Eintrag mit dem Titel Branch from „<Branch-Name>“….

Wählt man diesen Eintrag aus, bittet Xcode darum, den gewünschten Namen für den neuen Branch einzugeben. Der neue Branch entspricht hierbei zunächst exakt dem, der als Basis für diese Aktion ausgewählt wurde und übernimmt all dessen Commits; im gezeigten Screenshot ist das also der master-Branch.

Sobald der neue Branch erstellt wurde, taucht er umgehend in der Liste der Branches des zugehörigen Repositories auf und ist auf aktiv gesetzt (zu erkennen am Zusatz (current)).

Änderungen, die noch nicht committet wurden, stehen übrigens nach Erstellung und Wechsel des Branches ohne Einschränkungen im neuen Branch zur Verfügung.
Branch wechseln
Stehen einem so nun mehrere Branches zur Verfügung, ist auch ab und an ein Wechsel der Branches nötig (abhängig davon, an welchem Teil des Projekts man weiterarbeiten möchte). Um den aktiven Branch zu wechseln, klickt man zunächst den gewünschten Ziel-Branch mittels Sekundärklick an. Im Kontextmenü wählt man anschließend den Eintrag Checkout… aus.

Xcode fragt anschließend noch einmal nach, ob man den Branch tatsächlich wechseln möchte. Nach einer weiteren Bestätigung durch Klick auf Checkout befindet man sich auf dem gewählten Branch. Alle noch nicht committeten Änderungen vom zuvor aktiven Branch werden hierbei in den Ziel-Branch übernommen.
Fazit
Das Erstellen neuer Branches in Xcode gestaltet sich sehr einfach und unkompliziert. Man wählt zunächst den Basis-Branch aus und erstellt auf dessen Grundlage einen neuen. Der Wechsel zwischen verfügbaren Branches gestaltet sich als ebenso simpel.
Generell ermöglichen Branches es so, parallel an verschiedenen Teilen eines Projekts zu arbeiten. Gerade bei der Arbeit im Team ist das ein enorm wichtiger Aspekt.
Euer Thomas
Weitere Artikel dieser Reihe
- Teil 1: Das Repository: https://letscode.thomassillmann.de/grundlagen-der-source-control-teil-1/
- Teil 2: Änderungen speichern mit Commits: https://letscode.thomassillmann.de/grundlagen-der-source-control-teil-2/
- Teil 3: Änderungen verwerfen: https://letscode.thomassillmann.de/grundlagen-der-source-control-teil-3/
Hallo Thomas,
Ich möchte eine App entwickeln, die über Zeit immer mehr Funktionen bekommt.
Wenn ich denn über Zeit meine Programmierkenntnisse verbessert habe.
Würdest Du für eine Solch geplante App immer Source Control aktivieren?
Gerd
Hallo Gerd!
Ja, selbst bei kleinen (Test-)Projekten würde ich immer auf Source Control setzen. Mann muss die Funktionen ja nicht zwingend nutzen, ich finde sie aber schon bei kleinen Projekten enorm nützlich und hilfreich.
Hallo Thomas,
vielen Dank für die hervorragend erklärten Inhalte.
Ich möchte in meinem Projekt 2 Branches miteinander vergleichen. Und zwar den aktuellen mit einem älteren. Allerdings wird immer mit dem vorherigem Branch verglichen. Wie kann ich zwei beliebige aus der Branch-Histrory vergeichen ?
Vielen Dank und beste Grüße !
Torsten
Hallo Torsten,
aus dem Stand weiß ich nicht genau, wie der entsprechende Punkt in Xcode heißt bzw. aussieht (ich bereite mich gerade auf den Feierabend vor^^). In Xcode 13 gibt es jedoch einen neuen Code-Review-Mode. Den aktivierst du über die Schaltfläche mit den beiden entgegengesetzten Pfeilen oberhalb des Editors. Ist der aktiv, solltest du meines Wissens nach über den unteren rechten Rand steuern können, welche Commits du miteinander vergleichen möchtest. Inwieweit das auch Branch-übergreifend möglich ist, kann ich gerade leider nicht sagen.
Mit besten Grüßen,
Thomas
Hallo Thomas,
das hat mir sehr weiter geholfen. So funktioniert es.
Vielen herzlichen Dank für die Hilfe.
Beste Grüße
Torsten
Super, das freut mich zu lesen! 🙂