11 Branching und Merging

11.1 Branches in Git

In Git sind Branches bewegliche Zeiger, die auf spezifische Commits verweisen. Ein Branch ist also kein eigenständiges Objekt, sondern ein einfaches Label, das an einen Commit angehängt wird. Branches ermöglichen paralleles Arbeiten an verschiedenen Features oder Korrekturen, ohne den Hauptentwicklungszweig zu beeinträchtigen.

11.1.1 Eigenschaften von Branches

  1. Beweglichkeit von Branches: Ein Branch bewegt sich bei jedem neuen Commit automatisch auf den neuen Snapshot. Dies unterscheidet Branches von Tags, die fest mit einem spezifischen Commit verknüpft sind und sich nicht bewegen.
  2. Leichtgewichtige Referenzen: Da ein Branch lediglich ein Zeiger auf einen Commit ist, handelt es sich um ein leichtgewichtiges Konzept. Es entstehen keine zusätzlichen Kopien der Dateien, wenn ein neuer Branch erstellt wird.
  3. Trennung von Entwicklungssträngen: Branches werden genutzt, um verschiedene Entwicklungslinien zu verfolgen. Typische Verwendungen sind Feature-Branches, die für die Entwicklung neuer Funktionen erstellt werden, oder Bugfix-Branches.

11.1.2 Branches und Tags im Vergleich

11.2 Erstellung und Nutzung von Branches

Ein Branch wird mit dem Befehl git branch erstellt:

git branch <branchname>

Das Verschieben zu einem Branch erfolgt mit git checkout oder git switch:

git checkout <branchname>

Mit jedem neuen Commit auf diesem Branch wird der Zeiger des Branches auf den neuen Commit verschoben. Dies macht Branches in Git so flexibel und beweglich.

11.3 Merging in Git

Das Zusammenführen (Merging) von Branches ist der Prozess, bei dem zwei oder mehr Entwicklungsstränge zu einem vereinigt werden. Es gibt zwei Haupttypen von Merges:

  1. Fast-Forward Merge: Dieser Merge-Typ findet statt, wenn keine neuen Commits im Ziel-Branch existieren, seit der Quell-Branch erstellt wurde. Git kann in diesem Fall einfach den Zeiger des Ziel-Branches auf den letzten Commit des Quell-Branches verschieben, da kein echter Merge erforderlich ist.

  1. Three-Way Merge: Wenn beide Branches eigene Commits enthalten, die in den anderen Branch noch nicht integriert sind, führt Git einen Three-Way-Merge durch. Dieser Merge-Typ vergleicht den gemeinsamen Vorfahren der beiden Branches und vereint die Änderungen aus beiden Branches in einem neuen Commit.

11.4 Konflikte beim Merging

Konflikte treten auf, wenn Git Änderungen nicht automatisch zusammenführen kann, da sie sich in derselben Datei überschneiden. In einem solchen Fall muss der Entwickler die Konflikte manuell lösen, bevor der Merge abgeschlossen werden kann.

11.5 Rebasing

Rebasing ist ein alternativer Ansatz zum Merging, bei dem die Commits eines Branches auf einem neuen Basiskommit “neu aufgesetzt” werden. Das Ergebnis ist eine lineare Historie ohne Merge-Commits. Beim Rebase wird die Commithistorie des aktuellen Branches auf die Spitze eines anderen Branches verschoben.

Der Rebase-Prozess verläuft in zwei Schritten:

  1. Git entfernt die Commits des aktuellen Branches, bis es den gemeinsamen Vorfahren des Ziel-Branches erreicht.
  2. Git wendet die entfernten Commits in der Reihenfolge erneut an, aber mit dem Ziel-Branch als neue Basis.

Rebase kann verwendet werden, um eine klare, lineare Historie zu behalten, insbesondere in Projekten, die eine saubere Commit-Historie erfordern.

11.5.1 Unterschiede zwischen Merging und Rebasing