← retour aux snippets

git: worktree pour plusieurs branches

Travailler sur plusieurs branches simultanément sans re-cloner, avec ajout, suppression et nettoyage.


objectif

Ouvrir plusieurs branches d’un même dépôt en parallèle, chacune dans son dossier, sans dupliquer l’historique et sans re-cloner.

code minimal

# créer un worktree pour une nouvelle branche à partir de main
git fetch origin
git worktree add ../feature-x -b feature/x origin/main

utilisation

# lister les worktrees existants
git worktree list

# créer un worktree pour une branche existante (sans -b)
git worktree add ../hotfix-123 origin/hotfix/123

# créer un worktree à partir d'un commit détaché (read-only, review)
git worktree add --detach ../review-abc123 abc123

# supprimer un worktree (depuis le repo principal)
git worktree remove ../feature-x

# forcer la suppression si le dossier contient des fichiers non suivis
git worktree remove --force ../hotfix-123

# nettoyer les entrées orphelines (si un dossier a été supprimé manuellement)
git worktree prune

# pousser la nouvelle branche et ouvrir dans l'éditeur
cd ../feature-x
git push -u origin feature/x
code .  # ou votre éditeur

variante(s) utile(s)

# dossier dédié pour les worktrees
mkdir -p ../worktrees
git worktree add ../worktrees/feature-y -b feature/y origin/main
git worktree add ../worktrees/bugfix-42 -b bugfix/42 origin/main

# créer un worktree de build isolé (read-only)
git worktree add --detach ../build-$(date +%Y%m%d) HEAD
( cd ../build-$(date +%Y%m%d) && make -s )

# passer rapidement d'un worktree à l'autre
(cd ../feature-x && git status)
(cd ../worktrees/bugfix-42 && pytest -q)

# empêcher la création si la branche est déjà check-out ailleurs (sécurité)
git worktree add ../feature-x feature/x  # échouera si déjà active

# rebase/pull dans tous les worktrees (exemple simple)
for wt in $(git worktree list --porcelain | awk '/worktree /{print $2}'); do
  (cd "$wt" && git fetch -q && git rebase -q origin/$(git branch --show-current 2>/dev/null || echo main) || true)
done

notes

  • chaque worktree a son propre dossier de travail mais partage les objets Git: peu d’espace disque et très rapide.
  • une branche ne peut être check-out que dans un seul worktree à la fois (protection intégrée).
  • exécutez git worktree depuis le dépôt principal (pas depuis un worktree enfant pour gérer les autres).
  • évitez de supprimer manuellement les dossiers; utilisez git worktree remove puis git worktree prune en cas d’orphelins.
  • pratique pour les revues, hotfix, builds isolés et monorepos où les builds concurrents sont fréquents.