jj – Le CLI de Jujutsu
(steveklabnik.github.io)jj, l’interface en ligne de commande de Jujutsu, est un outil fondé sur un système de gestion de versions distribué (DVCS)- Il offre des fonctionnalités plus simples, plus intuitives et pourtant plus puissantes que
git - Il combine les atouts de
gitet de Mercurial afin de réduire le nombre d’outils de base et de renforcer leur intégration organique - Il utilise un backend compatible avec
git, ce qui permet d’expérimenter de manière indépendante tout en conservant l’environnement de collaboration existant - Pour les utilisateurs avancés, l’intérêt majeur est de pouvoir exploiter des fonctions supplémentaires de gestion de versions difficiles à obtenir avec
git
Présentation et caractéristiques de jj
-
jjest le CLI (interface en ligne de commande) de Jujutsu, et Jujutsu est un système de gestion de versions distribué (DVCS)- Les utilisateurs connaissent peut-être déjà d’autres DVCS comme
git, et le tutoriel part du point de vue d’un utilisateur degit jja été conçu comme un outil plus simple, plus facile à utiliser et pourtant puissant quegit- En général, « puissance » et « complexité » s’opposent, mais
jjpropose un nouvel équilibre jjcombine les points forts degitet de Mercurial (hg) pour former une nouvelle sorte de DVCS- Il réduit le nombre d’outils de base et offre un environnement de travail efficace grâce à l’intégration organique entre ces outils
- Les utilisateurs avancés peuvent tirer parti de fonctions supplémentaires de gestion de versions difficiles à reproduire avec
git jjutilise un backend compatible avecgit, ce qui permet d’expérimenter de manière indépendante sans modifier l’environnement de collaboration- Il reste compatible avec les dépôts
gitexistants et permet, si nécessaire, de revenir facilement àgit - Le tutoriel annonce qu’il montrera concrètement, à travers ces caractéristiques, pourquoi
jjest un outil qui mérite l’attention
- Les utilisateurs connaissent peut-être déjà d’autres DVCS comme
1 commentaires
Commentaires sur Hacker News
Beaucoup de discussions se concentrent sur les différences entre git et jj, mais je pense qu’il vaut mieux oublier git et se concentrer simplement sur le workflow de base de jj
Dans un dépôt propre, il suffit d’exécuter
jjpour voir l’état, puis après des modifications, de valider avecjj commit -m "made changes"En cas d’erreur, on corrige puis on fusionne dans le dernier commit avec
jj squashOn n’utilise
jj new -r lmnopque lorsqu’on veut travailler à partir d’une révision précise, comme sur une nouvelle brancheL’historique git reste visible avec
git log, et le fonctionnement interne de jj n’apparaît pasalias.save="!git add -A; git commit -m", que j’utilise ensuite avec$ git save "made changes"J’ai l’impression que JJ me demande de penser à l’envers
Avec git, on modifie puis on écrit le message de commit, alors qu’avec jj on crée d’abord un nouveau commit et on lui ajoute ensuite une description
J’ai l’habitude de partir d’un état sale où plusieurs fonctionnalités sont mélangées, puis de ne sélectionner que les changements nécessaires pour les valider ; en ne regardant que le tutoriel jj, je ne suis pas sûr que ce soit possible
jj newcorrespond à une sorte de zone de staging git videDans jj, il y a toujours un commit, et ce commit a un changeid stable calculé à partir du contenu du dossier
Si l’on veut répartir des changements en plusieurs commits, il suffit d’utiliser
jj splitjj newpour créer des commits temporaires en laissant le message videPlus tard, quand tout est prêt, je squash plusieurs commits en un seul et j’ajoute le message
Cette méthode fonctionne un peu comme un historique d’annulation, ce qui rend l’expérimentation bien plus confortable
jj newsignifie simplement « créer un nouveau commit au-dessus », donc il n’est pas nécessaire d’écrire une description tout de suiteJ’ai aussi essayé d’en prendre l’habitude au début, mais c’était au contraire inefficace
Un workflow similaire est recommandé depuis longtemps dans Git, et on peut consulter le Squash Workflow pour obtenir un flux proche de l’index de Git
Du coup, je garde plusieurs workspaces et j’utilise souvent la fonction shelve d’IntelliJ
Parfois, je stocke aussi temporairement des diff sous forme de patch git
Et j’essaie de cacher ce processus chaotique à mes collègues pour avoir l’air un peu plus professionnel
Ce qui me déplaît avec jj, c’est que les modifications de fichiers sont automatiquement validées
Si je fais un checkout d’un ancien commit pour l’explorer puis que je modifie des fichiers, ce commit est modifié et tout l’historique suivant est rebasé
Du coup, je dois créer de manière défensive un nouveau commit vide
Avec git, le dépôt ne change pas tant que je ne valide pas explicitement, ce qui me convient mieux
jj evologjj avait déjà une solution meilleure que le staging
Le fait d’être habitué à la CLI de git était au contraire un obstacle pour apprendre jj
Fait intéressant, utiliser jj permet de mieux comprendre la structure du moteur de stockage de git
jj newau lieu deedit, tu peux suivre les changements proprementJ’ai trouvé ça bien meilleur que jongler avec le stash de git
jj editest le plus gros piège de jjMieux vaut utiliser
jj new, et en cas d’erreur on peut récupérer avecjj undojj traite les commits comme des snapshots peu coûteux, donc il est plus logique de se concentrer sur les « changements » que sur les commits
Le rebase automatique devient immuable après le push, donc c’est sûr
Il suffit de combiner
jj newetjj squashpour le gérer comme une tête de branche gitjj facilite le travail en état de detached head
jj editEn passant à
jj new, le problème disparaîtLe dernier paragraphe sur jj est l’essentiel
Il utilise un backend entièrement compatible avec git, donc on peut l’essayer seul sans devoir faire migrer toute l’équipe
Et si ça ne plaît pas, on peut revenir à git à tout moment
Les opérations git ne sont pas enregistrées dans le log jj, donc il faut les importer manuellement
Sur un projet, il est conseillé de n’utiliser qu’une seule interface
Ma fonctionnalité préférée est
jj absorbElle déplace automatiquement les changements de la révision courante vers les commits antérieurs concernés
C’est pratique quand on a oublié de modifier un fichier de config ou
.gitignoreIl suffit de faire
jj new, d’effectuer les modifications, puisjj absorbEt surtout, le meilleur, c’est qu’il n’y a pas besoin de gérer de merge conflict
jj absorbs’applique mal, on peut revenir en arrière avecjj undoGrâce à cette fonction, même les rebase complexes ne font plus peur
git absorbdans gitJe n’ai pas pu mettre le tutoriel à jour depuis longtemps, mais j’utilise toujours jj tous les jours
J’ai été trop occupé avec la startup ersc.io pour travailler sur l’upstream
Les questions sont toujours les bienvenues
jj utilise des change ID stables, tandis que git utilise des commit ID immuables
C’est pour cela que dans jj, undo et rebase semblent beaucoup plus flexibles
Il m’arrive parfois d’avoir envie d’en voir davantage ; je me demande s’il existe une option pour tous les afficher d’un coup
jj est suffisamment différent de git pour mériter d’être essayé
Le simple fait d’expérimenter une autre approche permet d’élargir sa vision de l’ingénierie
Il n’est pas nécessaire de tout essayer, mais il est important de comprendre les trade-offs entre différents workflows
La relation entre git et jj me fait penser à celle entre C et Python
git relève de la traçabilité forensique, tandis que jj ressemble à des chapitres d’une histoire
Parfois, il faut réécrire les premiers chapitres pour que la suite soit plus naturelle
jj a été conçu autour de l’idée que « l’arbre de travail lui-même est un commit » et que « même un conflit peut être commité »
J’ai l’impression que l’affirmation « plus puissant et plus simple » a besoin d’exemples concrets
Si l’on n’a pas ce besoin, on peut ne pas percevoir l’intérêt de jj
Il faut l’utiliser soi-même pour comprendre
jj undosuffit à justifier sa valeurAvec git, on arrive facilement dans un état irrécupérable, alors qu’avec jj quelques undo suffisent pour s’en sortir
Grâce à jj, je me sens plus à l’aise pour exploiter un DAG non linéaire
Je manipule librement des changements avec plusieurs parents ou enfants
Avant, j’imposais inutilement un ordre, mais maintenant je peux exprimer clairement les dépendances
Le processus de revue et de soumission est aussi bien plus efficace