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).
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 featureJeż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 listAby 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.