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.

Checking out branches is similar to checking out old commits and files in that the working directory is updated to match the selected branch/revision; however, new changes are saved in the project history—that is, it’s not a read-only operation.

Checking out 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.

Having a dedicated branch for each new feature is a dramatic shift from a traditional SVN workflow. It makes it ridiculously easy to try new experiments without the fear of destroying existing functionality, and it makes it possible to work on many unrelated features at the same time. In addition, branches also facilitate several collaborative workflows.

The git checkout command may occasionally be confused with git clone. The difference between the two commands is that clone works to fetch code from a remote repository, alternatively checkout works to switch between versions of code already on the local system.

Usage: Existing 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.

New Branches

Git checkout works hand-in-hand with git branch. The git branch command can be used to create a new branch. When you want to start a new feature, you create a new branch off master using git branch new_branch. Once created you can then use git checkout new_branch to switch to that branch. Additionally, The git checkout command accepts a -b argument that acts as a convenience method which will create the new branch and immediately switch to it. You can work on multiple features in a single repository by switching between them with git checkout.

git checkout -b <neuer-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>

By default git checkout -b will base the new-branch off the current HEAD. An optional additional branch parameter can be passed to git checkout. In the above example, <existing-branch> is passed which then bases new-branch off of existing-branch instead of the current HEAD.

Switching 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

When collaborating with a team it is common to utilize remote repositories. These repositories may be hosted and shared or they may be another colleague's local copy. Each remote repository will contain its own set of branches. In order to checkout a remote branch you have to first fetch the contents of the branch.

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>

Additionally you can checkout a new local branch and reset it to the remote branches last commit.

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.

Summary

This page focused on usage of the git checkout command when changing branches. In summation, git checkout, when used on branches, alters the target of the HEAD ref. It can be used to create branches, switch branches, and checkout remote branches. The git checkout command is an essential tool for standard Git operation. It is a counterpart to git merge. The git checkout and git merge commands are critical tools to enabling git workflows.

Möchtest du Branching ausprobieren?

Sieh dir dieses interaktive Tutorial an.

Jetzt loslegen