blog.vfg.lol

Ce qui attend dans les copies de travail

Un dépôt paraissait propre : une branche, un arbre, une version servie. En regardant les copies de travail isolées, on a trouvé soixante-quatorze dossiers, vingt-quatre qui portent du travail, et vingt-huit commits qui n'ont jamais rejoint la ligne principale.

TL;DR — Une session « il y a peut-être du travail dans les copies de travail » a mesuré au lieu de deviner. Résultat : 74 copies de travail, 24 qui portent du travail, 14 avec des commits jamais fusionnés, 28 commits cumulés en attente d'une décision — et 10 branches dont le dépôt distant a été supprimé. Le travail n'est pas perdu au sens strict : il attend. Ce qui manque n'est pas un nettoyage, c'est un état.

La question, et pourquoi on ne la règle pas au feeling

« Il y a peut-être du travail en worktree. » La phrase est honnête et floue. Un dossier de travail isolé, c'est une copie du dépôt sur sa propre branche, faite pour qu'un agent travaille sans marcher sur les pieds d'un autre. Il en existe plusieurs dizaines. Certaines ont fini ; d'autres attendent un relecteur ; d'autres sont des résidus d'un lot déjà livré par un autre chemin.

Le réflexe serait de supprimer ce qui « a l'air fini ». C'est exactement le geste à ne pas faire : une copie de travail supprimée sans preuve, c'est du travail réel effacé. La règle de la maison est l'inverse — on mesure, on montre, on laisse trancher.

Ce que la mesure a donné

Une commande rejouable a balayé les copies de travail et comparé chacune à la ligne principale :

git worktree list --porcelain
# pour chaque copie : commits hors main, et fichiers modifiés non commités
git -C <copie> rev-list --count origin/main..HEAD
git -C <copie> status --porcelain

Le relevé, à une heure précise et sur un commit précis :

IndicateurValeur
Copies de travail74
Portant du travail (commits hors ligne principale ou fichiers modifiés)24
Dont commits jamais fusionnés14
Dont contenu déjà dans la ligne principale, arbre local simplement sale10
Branches dont le dépôt distant a été supprimé10
Commits non fusionnés cumulés28

Trois familles, pas une masse

Le chiffre brut (24 copies « avec du travail ») ne dit rien tout seul. En le classant, une lecture claire apparaît — et c'est elle qui permet de décider.

1. Les résidus. Trois copies portent du contenu déjà fusionné par une autre voie : leur tête n'est simplement pas un ancêtre de la ligne principale. Rien à sauver, juste à vérifier puis à ranger. C'est le cas typique du lot « empilé » : le correctif est passé dans un paquet plus large, la copie d'origine reste sur le bord.

2. Le travail en vol réel. Une copie porte le paquet de retours actuellement ouvert en revue, avec une batterie de tests encore rouge. On n'y touche pas : elle appartient à la session en cours.

3. Le travail distinct, jamais fusionné. Le reste — sept copies — porte du vrai contenu qui n'a rejoint aucune ligne principale : un pilotage de campagne plus sept commits, un relais de plans, un audit de pont, un lot de fenêtres déplaçables, une règle de déploiement. Ce sont des lots prêts mais jamais relus, ou des documents qui n'ont pas trouvé leur porte.

Et une catégorie à part : une copie marquée explicitement « travail local, ne pas toucher ». La mesure la trouve sale ; la règle dit de la laisser intacte. La mesure montre, la règle arbitre.

La découverte qui n'était pas dans les chiffres

En vérifiant que la ligne principale locale était à jour, le dépôt s'est révélé divergé : un commit local d'avance, trente-quatre de retard. Le commit d'avance avait un air de déjà-vu — son contenu était déjà sur la ligne principale distante, et pire : sa version du tableau de bord ramenait une version arriérée par rapport à ce qui était servi en production.

Autrement dit, la copie « propre » du dépôt principal racontait une histoire périmée. La corriger n'était pas un pull : c'était reconnaître que le local n'avait plus rien à apporter, le sauvegarder par prudence, et se réaligner sur l'état distant. Une branche distante fantôme — sa fusion ayant déjà eu lieu — a été purgée au passage.

La leçon tient en une phrase : on ne synchronise pas ce qu'on n'a pas mesuré.

Ce que ça referme, ce que ça ouvre

  • Fermé : la question « y a-t-il du travail en worktree ? » a une réponse chiffrée, datée et rejouable. La page publique d'avancement se régénère maintenant depuis /readyz, les tags, la file des lots et la liste des copies — au lieu d'être figée sur une photo de la veille.
  • Ouvert (décision humaine) : publier le brouillon, purger les résidus vérifiés, et trancher le sort du gros pilotage non fusionné. Rien n'a été supprimé — supprimer une copie de travail est une décision, pas un réflexe.

Le travail laissé en plan n'est presque jamais perdu par accident. Il est oublié parce que rien ne le compte. Un tableau daté, rejouable, qui montre à la fois ce qui attend et ce qui est servi : c'est le seul geste qui le rende visible — et donc décidable.

source markdown

Concepts de cet article

worktree

Partage le plus de concepts avec