Arbeiten mit Branches

git checkout

 

Auf dieser Seite nehmen wir den Befehl git checkout unter die Lupe. Wir werden Anwendungsbeispiele und Grenzfälle behandeln. Im Git-Jargon versteht man unter einem "Checkout" eine Art Wechseln zwischen verschiedenen Versionen einer Zieleinheit. Der Befehl git checkout agiert zwischen drei unterschiedlichen Einheiten: Dateien, Commits und Branches. Neben dieser Bedeutung von "Checkout" wird auch oft der Ausdruck "auschecken" verwendet, um vom Ausführen des Befehls git checkout zu sprechen. Beim Thema Änderungen rückgängig machen haben wir dir gezeigt, wie du mit git checkout alte Commits abrufen kannst. Unser Augenmerk hier wird auf Checkout-Vorgängen bei Branches liegen.

Das Auschecken von Branches funktioniert ähnlich wie das Checkout alter Commits und Dateien: Das Arbeitsverzeichnis wird mit den Änderungen aus dem ausgewählten Branch bzw. der ausgewählten Revision aktualisiert. Neue Änderungen werden jedoch im Projektverlauf gespeichert. Es handelt sich also nicht um eine schreibgeschützte Operation.

Checkout von Branches

Über den Befehl git checkout kannst du zwischen Branches wechseln, die du mit git branch erstellt hast. Wenn du einen Branch auscheckst, werden die Dateien im Arbeitsverzeichnis mit den in dem betreffenden Branch gespeicherten Versionen aktualisiert und Git speichert alle neuen Commits in dem ausgecheckten Branch. Du wählst also im Grunde genommen aus, an welcher Entwicklungslinie du arbeiten möchtest.

Im Vergleich zu einem herkömmlichen SVN-Workflow ist es etwas ganz anderes, für jedes neue Feature einen eigenen Branch zu nutzen. Neue Experimente sind das reinste Kinderspiel und du musst dabei nicht befürchten, eine bestehende Funktionalität zu zerstören. Außerdem kannst du so an vielen nicht zusammengehörigen Features gleichzeitig arbeiten. Außerdem vereinfachen Branches viele Workflows zur Zusammenarbeit.

Der Befehl git checkout wird möglicherweise gelegentlich mit git clone verwechselt. Der Unterschied zwischen beiden Befehlen besteht darin, dass beim Klonen Code von einem Remote-Repository abgerufen wird und dass im Gegensatz dazu beim Auschecken zwischen Code-Versionen gewechselt wird, die sich bereits auf dem lokalen System befinden.

Anwendung: bestehende Branches

Nehmen wir einmal an, in dem Repository, in dem du gerade arbeitest, sind bereits Branches vorhanden. Mit git checkout kannst du zwischen diesen Branches wechseln. Führe git branch aus, um zu sehen, welche Branches verfügbar sind und wie der aktuelle Branch heißt.

$> git branch
master
another_branch
feature_inprogress_branch
$> git checkout feature_inprogress_branch

Im Beispiel oben siehst du, wie du eine Liste verfügbarer Branches mit dem Befehl git branch auflisten und zu einem bestimmten Branch, hier feature_inprogress_branch wechseln kannst.

Neue Branches

Git checkout arbeitet Hand in Hand mit git branch. Mit dem Befehl git branch kann ein neuer Branch erstellt werden. Wenn du ein neues Feature einführen möchtest, erstellst du einen neuen Branch des master mithilfe von git branch new_branch. Sobald die Erstellung abgeschlossen ist, verwendest du git checkout new_branch, um zu diesem Branch zu wechseln. Zusätzlich akzeptiert der Befehl git checkout ein Argument -b, das eine bequeme Möglichkeit darstellt und den neuen Branch erstellt und sofort darauf wechselt. Du kannst in einem einzelnen Repository an mehreren Features arbeiten, indem du mit git checkout zwischen ihnen wechselst.

git checkout -b <new-branch>

Im Beispiel oben wird der <new-branch> gleichzeitig erstellt und ausgecheckt. Die Option -b vereinfacht den Prozess und weist Git an, git branch <new-branch> vor git checkout <new-branch> auszuführen.

git checkout -b <new-branch> <existing-branch>

Standardmäßig verwendet git checkout -b den new-branch des aktuellen HEAD als Grundlage. Ein optionaler zusätzlicher Branch-Parameter kann an git checkout angehängt werden. Im Beispiel oben wird <existing-branch> angehängt und dient dann als Grundlage für new-branch von existing-branch anstatt des aktuellen HEAD.

Wechseln von Branches

Das Wechseln von Branches ist ein einfacher Vorgang. Mit folgendem Befehl wird ein Verweis von HEAD zur Spitze von <branchname> erstellt.

git checkout <branchname>

Git legt im Reflog einen Verlauf der Checkout-Vorgänge an. Mit git reflog kannst du den Verlauf sehen.

git checkout bei Remote-Branches

Bei der Zusammenarbeit im Team werden häufig Remote Repositorys verwendet. Diese Repositorys können gehostet oder freigegeben werden oder es kann sich um die lokale Kopie eines anderen Kollegen handeln. Jedes Remote-Repository besitzt seinen eigenen Satz an Branches. Damit du einen Remote-Branch auschecken kannst, musst du zunächst die Inhalte des Branches abrufen.

git fetch --all

In neueren Versionen von Git kannst du den Remote-Branch wie einen lokalen Branch auschecken.

git checkout <remotebranch>

Bei älteren Git-Versionen ist es erforderlich, einen neuen Branch auf Basis des Remote-Branches zu erstellen.

git checkout <remotebranch> origin/<remotebranch>

Zusätzlich kannst du einen neuen lokalen Branch auschecken und ihn auf den letzten Commit des Remote-Branches zurücksetzen.

git checkout -b <branchname>
git reset --hard origin/<branchname>

Detached HEADs

Gerade haben wir die drei wichtigsten Verwendungszwecke von git checkout für Branches kennengelernt. Nun ist es wichtig, dass du den Zustand des "losgelösten" HEADs verstehst. Du erinnerst dich: Als HEAD wird in Git der aktuelle Snapshot bezeichnet. Intern aktualisiert der Befehl git checkout den HEAD lediglich so, dass er auf den angegebenen Branch oder Commit verweist. Zeigt der Verweis auf einen Branch, meldet Git kein Problem. Wenn du allerdings einen Commit auscheckst, wechselst du in einen Zustand mit "losgelöstem" HEAD.

Für dich ist das eine Warnung: Du wirst darauf hingewiesen, dass alle Änderungen, die du vornimmst, von der restlichen Entwicklung des Projekts "losgelöst" sind. Wenn du also bei losgelöstem HEAD mit der Arbeit an einem neuen Feature beginnst, wird kein Branch angelegt, über den du deine Arbeit später referenzieren könntest. Sobald du einen anderen Branch auscheckst, beispielsweise um dein Feature in ihn zu integrieren, hättest du dann keine Möglichkeit, auf dieses Feature zu verweisen:

Sämtliche Entwicklungsarbeit sollte immer in einem Branch stattfinden, niemals in einem losgelösten HEAD. Nur dann ist sichergestellt, dass du auf deine neuen Commits verweisen kannst. Wenn du dir allerdings lediglich einen alten Commit anschauen möchtest, spielt es keine Rolle, ob du in einem losgelöstem HEAD arbeitest.

Zusammenfassung

Auf dieser Seite lag der Schwerpunkt auf der Verwendung des Befehls git checkout beim Ändern von Branches. Zusammenfassend lässt sich sagen, dass git checkout bei der Verwendung auf Branches das Ziel der HEAD-Referenz ändert. Er kann verwendet werden, um Branches zu erstellen, zu wechseln und um Remote-Branches auszuschecken. Der Befehl git checkout ist ein wichtiges Tool für den Standard-Git-Betrieb. Er ist das Gegenstück zu git merge. Die Befehle git checkout und git merge sind wichtige Tools zur Unterstützung von git workflows.

Möchtest du Branching ausprobieren?

Sieh dir dieses interaktive Tutorial an.

Jetzt loslegen