Logo der Firma Zelantic, auf dem ein Polarfuchs zu sehen ist

Git Branching

card image

Es ist wieder #TechFriday! Das ist der fünfte Post in der Reihe Git, viel Spaß beim Lesen.

Im letzten Blogeintrag wurde das Arbeiten mit Remotes vorgestellt. In diesem Post werden die Grundlagen von Branches behandelt.

Branches:

Im ersten Teil der Reihe habe ich es bereits erwähnt: Git speichert die Änderungen als Zustand ab. Dabei enthält jeder Zustand die Daten des Autors, die Commit-Nachricht und einen Zeiger auf den vorherigen Zustand. Es ist nun möglich eine Abzweigung zu erstellen (im englischen Branch), die auf einen bestimmten Zustand zeigt. Ihr habt meistens den master-Branch, der automatisch erstellt wird. Wenn ihr ein neues Feature entwickeln wollt, aber nicht auf der Hauptversion arbeiten wollt, könnt ihr einfach einen Branch erstellen und auf diesem weiterarbeiten.

Ihr erstellt einen Branch, indem ihr den Befehl
git branch
benutzt. Durch diesen Befehl habt ihr einen neuen Branch erstellt, allerdings arbeitet ihr noch nicht auf diesem.

Git nutzt einen Pointer namens HEAD, der immer auf den aktuellen Branch zeigt. Wenn ihr den Branch wechseln wollt, müsst ihr den Befehl
git checkout
benutzen. Wenn ihr jetzt eine Änderung durchführt und diese pusht, werden die Änderungen nur in diesem Branch abgebildet.

Um einen Branch zu erstellen und direkt zu ihm zu wechseln nutzt man den Befehl
git checkout -b

Da beim wechseln der Branches alle Dateien geändert werden, müssen alle Änderungen, die ihr durchgeführt habt, commited werden. Ansonsten lässt Git den Wechsel nicht zu.

Merging:

Beim Zusammenführen der verschiedenen Branches gibt es mehrere Fälle. Wenn beide Branches miteinander verbunden werden können, dann wird der hintere Branch nach vorne verlegt und beide zeigen nach dem Zusammenführen auf den gleichen Zustand. Wenn die beiden Branches nicht hintereinander liegen, gibt es zwei Fälle: entweder die Änderungen sind an unterschiedlichen Dateien, dann kann die Zusammenführung durchgeführt werden, oder die Änderungen sind an der selben Datei, dann muss man den Konflikt lösen.

Prinzipiell werden die Branches mit folgendem Befehl zusammengeführt
git merge

Ihr könnt mit git status prüfen, ob es Probleme beim Zusammenführen gab. Bei einem Konflikt sieht die Ausgabe beispielhaft so aus:

On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add ..." to mark resolution)
both modified: filename.file
no changes added to commit (use "git add" and/or "git commit -a")

Die Datei wird bei einem Konflikt gekennzeichnet, der Code sieht dann so aus:

<<<<<<< HEAD:filename.file
Code des aktuellen Branches
=======
Code des anderen Branches
>>>>>>> Branchname:filename.file

Ihr könnt das Problem manuell beheben, indem ihr den Code durch einen einheitlichen code ersetzt und diesen dann staged (zur Erinnerung: mit git add). Ein erneuter Aufruf von git status zeigt euch dann, ob der Konflikt behoben wurde. Wenn alles in Ordnung ist, müsst ihr noch git commit ausführen um die Zusammenführung zu vollenden. Der Commit hat einen Standardtext, diesen könnt ihr im Nachhinein noch anpassen, wenn dies nötig ist.

Zusammenfassung:

In diesem Artikel ging es um das Branching-System von Git und wie man seine Änderungen wieder zusammenführt. Es wurde außerdem erklärt wie ihr verschiedene Branches zusammenführt und die Probleme die entstehen können. Nächste Woche werden die Git GUIs kurz erklärt und die Einführung in Git abgeschlossen.