In der Regel klont man sich ein Git-Repository, in dem auch ein Arbeitsverzeichnis eines Branches ausgecheckt ist. Je nach Projektart kann es passieren, dass eine Arbeitskopie nicht reicht. Das ist etwa dann der Fall, wenn man ein Projekt kompilieren muss, was eine Zeit in Anspruch nimmt, in derselben Zeit aber auf einem anderen Branch weiterarbeiten möchte. Im Standard geht das so mit einem geklonten Repository nicht, da sich beim Wechsel des Branches das Arbeitsverzeichnis verändert und somit auch die Kompilierung nicht voll durchläuft bzw. es zu Fehlern kommt.

Was an dieser Stelle einige machen ist folgendes: Ein weiteren Klon des Repositorys anlegen und darin weiterarbeiten. Das ist aus gleich mehreren Gründen eine nicht optimale Option. Zum einen verliert man die ganze Konfiguration eines Git-Repositorys, darunter fallen insbesondere die Konfiguration von Remote-Repositorys und die angelegten lokalen Branches und Commits. Bei dem zweiten Klon kann man zwar die Remote-Repositorys konfigurieren, zwischen rein lokalen Branches zu wechseln ist dann aber schwieriger. Ein weitere Grund ist der Plattenplatz, da gleich zweimal das gleiche Repository Platz auf der Festplatte belegt. Bei kleinen Repositorys ist das vielleicht weniger relevant und verschmerzbar, bei größeren Repositorys kann das aber durchaus ungünstig sein.

Eine Lösung für das Problem bietet git worktree. Mit worktree lassen sich mehrere Arbeitsverzeichnisse handhaben, die zu einem Repository gehören. Damit kann man gleich mehrere Branches in verschiedenen Ordnern auschecken, mit diesen Arbeiten. Im Endeffekt hat man weiterhin nur ein Repository, in dem alle Revisionen und Objekte gespeichert sind.

Mit Worktrees arbeiten

Ein zusätzlicher Worktree kann recht einfach angelegt werden. Der Befehl ist allerdings vergleichsweise lang. Wenn man sich schon in einem Arbeitsverzeichnis eines Git-Repositorys befindet, dann reicht folgender Befehl, um einen weiteren Worktree anzulegen:

$ git worktree add -b fix/0815 ../temp-worktree master

Der Subbefehl worktree ist wohl genauso klar, wie der Parameter add um einen weiteren Worktree anzulegen. Mit -b fix/0815 gibt man den Namen des neuen Branches an, der für den Worktree genutzt werden soll – dies ist somit äquivalent zu git checkout -b fix/0815. Danach folgt der Pfad, wo der Worktree lokal hingesetzt werden soll. Zum Schluss noch der Name des Branches, von dem der neue Branch angelegt werden soll, in diesem Fall einfach master.

Das ganze geht auch etwas einfacher, wenn man nicht einen neuen Branch anlegen möchte:

$ git worktree add ../fix-4711

Wenn man anschließend in den Worktree wechselt und schaut, auf welchem Branch man sich befindet, dann ist es der neue Branch fix-4711. Als Basis-Branch wurde dafür dann automatisch der aktuelle Branch genommen. Wie man sieht, legt Git-Worktree dann automatisch den Worktree an dem angegebenen Verzeichnis an und legt den Branch mit demselben Namen an. Mit list kann man sich alle Worktrees anzeigen lassen.

$ git worktree list
/home/sujee/Repositories/svijorg       bbc5c37 [master]
/home/sujee/Repositories/fix-4711      bbc5c37 [fix-4711]

Wenn man die Arbeit an einem Worktree abgeschlossen hat und es nicht mehr braucht, kann man den Worktree einfach entfernen, etwa mit rm. Anschließend sollte man nur die Referenz im eigentlichen Repository dann löschen.

$ rm -rf ../fix-4711
$ git worktree prune

Die Referenz auf nicht erreichbare bzw. nicht existente Worktrees werden von der Garbage Collection nach und nach selbst gelöscht. Wenn man allerdings Worktrees auf potenziell nicht erreichbaren Verzeichnissen ablegt, also auf mobilen oder Netzwerk-Datenträgern, dann kann man sie auch locken, um ein prune von der GC zu verhindern.

Die übliche Handhabung von Worktress ist sonst wie in einem normalen Repository auch: Man kann wie gehabt von allen Worktrees aus Branches anlegen, Commits erzeugen und die Änderungen pushen und pullen.

Für viele dürfte git worktree ein Feature sein, dass sie nicht brauchen, für einige wiederum ist dies doch ein sinnvolles Feature von Git, was man hin und wieder gebrauchen kann und dabei etwas Arbeit und Zeit spart.