git worktree : travailler sur plusieurs branches en même temps

Vous êtes en train de développer une fonctionnalité sur feature/nouveau-module. Un bug critique remonte en production. Pour le corriger, vous devez basculer sur main — mais votre travail en cours n’est pas commitable. Vous faites git stash, basculez, corrigez, revenez, git stash pop… et parfois ça se passe mal.

git worktree résout ce problème autrement : plusieurs branches peuvent être actives en même temps dans des dossiers séparés.

Ce que fait git worktree

Un worktree est un répertoire de travail associé à un dépôt git. Par défaut, un dépôt a un seul worktree. git worktree add en crée d’autres, chacun pointant vers une branche différente, tous partageant le même dépôt .git.

# Créer un worktree pour la branche main dans ../mon-projet-main
git worktree add ../mon-projet-main main

Vous avez maintenant deux dossiers :

  • ~/Dev/mon-projet — votre branche feature en cours
  • ~/Dev/mon-projet-main — main, prêt à travailler

Chaque dossier est indépendant. Vous pouvez ouvrir les deux dans votre éditeur simultanément.

Cas d’usage typique : hotfix en urgence

# Vous êtes sur feature/nouvelle-api avec du travail en cours
git worktree add ../mon-projet-hotfix main

# Dans un autre terminal
cd ../mon-projet-hotfix
git checkout -b hotfix/bug-critique
# ... corrigez le bug
git commit -m "fix: corriger le bug critique"
git push

# Revenez à votre feature sans avoir rien touché
cd ../mon-projet
# Votre travail est intact, aucun stash nécessaire

Créer un worktree avec une nouvelle branche

# -b crée une nouvelle branche
git worktree add -b feature/ma-branche ../mon-projet-feature

Lister et supprimer les worktrees

# Voir tous les worktrees actifs
git worktree list
# /home/user/Dev/mon-projet        abc1234 [feature/nouvelle-api]
# /home/user/Dev/mon-projet-main   def5678 [main]

# Supprimer un worktree (depuis le repo principal)
git worktree remove ../mon-projet-main

# Forcer la suppression si le dossier a des modifications
git worktree remove --force ../mon-projet-main

# Nettoyer les références de worktrees supprimés manuellement
git worktree prune

Comparaison de code entre branches

# Créer un worktree pour comparer deux implémentations
git worktree add ../mon-projet-v2 feature/refacto-v2

# Ouvrez les deux dossiers dans VS Code
code ../mon-projet
code ../mon-projet-v2

Plus besoin de git diff pour tout comparer — vous voyez les deux versions en direct dans l’éditeur.

Worktree pour les reviews de PR

# Checkout d'une PR pour review sans toucher votre branche
git worktree add ../pr-review origin/feature/pr-a-reviewer

cd ../pr-review
npm install
npm run dev
# Testez la PR dans le navigateur

Points importants

Une branche ne peut être checkout que dans un seul worktree à la fois. Si vous avez déjà main dans un worktree, vous ne pouvez pas en créer un autre pour main.

Les worktrees partagent le même .git. Un commit dans un worktree est immédiatement visible dans les autres. Les stash aussi.

Les node_modules ne sont pas partagés. Chaque worktree est un dossier indépendant — vous devez relancer npm install dans chaque nouveau worktree si votre projet a des dépendances.

+ Les points forts

  • Pas de stash — chaque branche garde son état exactement où vous l’avez laissé
  • Parallélisme réel — deux serveurs de dev peuvent tourner simultanément sur deux branches
  • Natif git — pas de dépendance externe, disponible depuis git 2.5 (2015)
  • Partage du .git — les objets git sont partagés, pas de duplication des données du dépôt
  • Idéal pour les monorepos — travailler sur deux packages simultanément sans jongler avec les branches

- Les points faibles

  • node_modules à dupliquer — chaque worktree nécessite son propre npm install, ce qui prend de la place et du temps
  • Confusion possible — deux dossiers qui ressemblent au même projet peuvent dérouter. Nommez bien vos worktrees
  • Pas adapté aux changements de config — si votre branche change package.json ou la config webpack, les deux worktrees ne sont plus équivalents
  • Commandes depuis le bon répertoire — certaines commandes git (comme git worktree remove) doivent être lancées depuis le repo principal

En résumé

git worktree est une fonctionnalité native de git sous-utilisée. Pour quiconque jongle régulièrement entre branches — hotfixes, reviews de PR, comparaisons — c’est une amélioration substantielle par rapport au cycle stash/checkout/stash-pop.


Voir aussi :

  • lazygit — gérer git et les branches en interface TUI
  • delta — visualiser les diffs avec coloration syntaxique