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
kann gelegentlich mit git clone
verwechselt werden. 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 im 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
main
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 aus dem main
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, um den neuen Branch zu erstellen und sofort zu diesem zu wechseln. 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
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 -b <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 für das Ändern von Branches der Schwerpunkt auf der Verwendung des Befehls git checkout
. 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, zwischen Branches zu wechseln und um Remote-Branches auszuchecken. Der Befehl git checkout
ist ein wichtiges Tool für reguläre Git-Vorgänge. Er ist das Gegenstück zu git merge
. Die Befehle git checkout
und git merge
sind wichtige Tools zur Unterstützung von git workflows
.