Contents

Git Worktree - czyli wiele gałęzi jednego repozytorium

Git worktree to jedna z tyhc funkcji w Gicie, których nie udało mi się znaleźć w jakimkolwiek kursie poświęconym temu programowi. Zastanawiałem się też, dlaczego tak jest… Nikt tego nie zna? Nie używa? A może to jakaś niszowa funkcja, z której korzystają tylko wybrańcy?

Od kiedy sam zacząłem nardzędzia worktree, to wiem już, że powinno się znajdować w “arsenale” każdego użytkownika Gita.

Czym jest Git Worktree?

Git worktree to funckja, która umożliwia pracę na wielu gałęziach w ramach jednego repozytorium Git. Bez konieczności ciągłego stashowania zmian i przełączania branchy, czy wielkrotnego klonowania tego samego repozytorium.

Inna istotna cecha: gażde “drzewo” jest połączone bezpośrednio z oryginalnym klonem repozytorium, więc wszystkie zmiany są natychmiast widoczne we wszystkich worktree. Np robienie zaciąganie zmian do folderu gdzie masz aktualnie ustawiony branch main, od razu będzie widoczne w gałęzi feature (jeżeli oczywiście nie ma konfliktów).

Wskazówka
Jeżeli chciałbyś podejrzeć jak dokładniej działa powiązanie między gałęzią worktree a oryginalnym repozytorium, to po utworzeniu nowej gałęzi, użyj wewnątrz niej ls -la i sprawdź co się kryje pod .git.

Co jeszce jest ważne, to fakt, że każdy worktree jest oddzielnym katalogiem zawierającym aktualną rewizję, podobnie jak oryginalne repozytorium. Jeżeli masz np. repozytorium app-backend (a w nim wycheckoutowany main) to możesz stworzyć równoległy worktree o nazwie app-backend-feature, w którym wycheckoutujesz branch feature.

Jak tego używać?

Aby utworzyć nowey worktree (zakładam, że masz już jakieś repozytorium na swoim komputerze)

git worktree add <ścieżka_do_nowego_katalogu> <nazwa_brancha_do_checkoutu>

Przykład:

git worktree add ../app-backend-feature feature

Jeżeli wyżej wymieniony kod uruchomisz w katalogu głównym swojego repo, to równlegle do niego utworzyć katalog zawierający worktree (zakładamy, że branch feature już istnieje).

Jeżeli chcesz podejrzeć list już aktualnie istniejących gałęzi:

git worktree list

Aby usunąć worktree, użyj polecenia remove:

git worktree remove <ścieżka_do_katalogu_worktree>

Multi checkout

Jeżeli będziesz korzystać z mechanizmu worktree, pamiętaj, że nie możesz mieć tego samego brancha wycheckoutowanego na więcej niż jednej gałęzi. Przy próbie checkoutu, git rzuci błędem podobnym do poniższego:

fatal: 'branch-name' is already checked out at '/path/to/other/worktree'

Jeżeli chcesz mimo wszystko przełączyć się na ten branch, to najpierw musisz usunąć wspomniany w błędzie worktree, lub zmienić użyty na nim branch.

Szybka optymalizacja

Od kiedy sam korzystam z tego mechanizmu, bardzo szybko potrzebowałem go “nieco zoptymalizować”. Czyli domyślnym zachowaniem jest listowanie aktualnie istniejących gałęzi, a inne zachowanie ma kierować już do innych subkomend. Czyli do gry wkracza poniższa funkcja shellowa:

gwtr() {
    if [ -z "$1" ]; then
        git worktree list
    else
        git worktree "$@"
    fi
}

Zmienna $@ oznacza aktualne parametry wywoływanej funkcji, z zachowaniem białych znaków i cudzysłowów. Czyli klasyczne passthrough.

Podsumowanie

Worktree to świetna funkcja, o której (takie mam wrażenie) mało kto wie. Polecam skorzystać, bardzo ułatwia pracę z wieloma branchami w jednym repozytorium (w mojej pracy to norma). Oczywiście to nie jest pełne spektrum funkcjonalności jakie to narzędzie oferuje, ale szczerze - jak dotąd nie potrzebowałem więcej. Chociaż oczywiście zachęcam, do zapoznania się z manualem: man git-worktree.