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.
Der Git-Branch-Checkout funktioniert ähnlich wie der 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.
So funktioniert in Git der Branch-Checkout
Über den Befehl git checkout
kannst du zwischen Branches wechseln, die du mit git branch
erstellt hast. Wenn du in Git einen Branch-Checkout ausführst, 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, zu welchem Git-Branch du wechseln möchtest, um an dieser Entwicklungslinie weiterzuarbeiten.
Im Vergleich zu einem herkömmlichen SVN-Workflow ist es etwas ganz anderes, für jedes neue Feature in Git den Branch zu wechseln. 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.
Zugehöriges Material
Git-Protokoll für Fortgeschrittene
Lösung anzeigen
Git kennenlernen mit Bitbucket Cloud
Anwendung: zwischen bestehenden Git-Branches wechseln
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.
Zu neuen Git-Branches wechseln
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
.
In Git Branches wechseln
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 Branch-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 vor dem Checkout die Branch-Inhalte 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 Branch-Checkouts 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
-Ref ä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.
Diesen Artikel teilen
Nächstes Thema
Lesenswert
Füge diese Ressourcen deinen Lesezeichen hinzu, um mehr über DevOps-Teams und fortlaufende Updates zu DevOps bei Atlassian zu erfahren.