Jujutsu (jj) - Feuille de triche système de contrôle de version compatible Git
Jujutsu (jj) est un système de contrôle de version moderne qui est compatible avec Git — il utilise un dépôt Git comme backend, vous pouvez donc l”adopter sur les dépôts existants et interopérer avec les coéquipiers utilisant Git. Son modèle est différent et, pour beaucoup, plus simple : la copie de travail est elle-même un commit (pas de zone de staging séparée), les conflits sont des objets de première classe que vous pouvez committer et résoudre plus tard, et chaque opération est enregistrée dans un journal des opérations que vous pouvez annuler. Il n”y a pas de branches au sens Git par défaut ; vous travaillez avec des changements identifiés par des ID de changement stables.
Installation
| Plateforme | Commande |
|---|
| Cargo | cargo install --locked jj-cli |
| macOS (Homebrew) | brew install jj |
| Arch Linux | sudo pacman -S jujutsu |
| Nix | nix profile install nixpkgs#jujutsu |
| Windows (Scoop) | scoop install jujutsu |
| Vérifier | jj --version |
Configuration
| Commande | Description |
|---|
jj config set --user user.name "Your Name" | Définir votre nom |
jj config set --user user.email "you@example.com" | Définir votre email |
jj git init --colocate | Initialiser jj dans un dépôt Git existant (garde .git) |
jj git clone <url> | Cloner un dépôt Git avec jj |
jj git init | Créer un nouveau dépôt jj (backend natif) |
Concepts principaux
| Terme | Sens |
|---|
| Change | Un changement logique avec un ID de changement stable (survit aux réécritures) |
| Commit | Un snapshot ; la copie de travail est toujours un commit (@) |
@ | Le commit de copie de travail actuel |
| Revset | Un langage de requête pour sélectionner les commits |
| Operation log | Historique des opérations de dépôt, chacune annulable |
| Bookmark | Un pointeur nommé (mappe à une branche Git à la poussée) |
Workflow quotidien
| Commande | Description |
|---|
jj status | Afficher les changements de copie de travail |
jj log | Afficher le graphique des commits |
jj diff | Diff du commit de copie de travail |
jj describe -m "msg" | Définir/remplacer le message du commit actuel |
jj new | Démarrer un nouveau changement au-dessus de celui actuel |
jj new <rev> | Démarrer un nouveau changement au-dessus d”un commit spécifique |
jj edit <rev> | Faire d”un commit existant la copie de travail |
jj commit -m "msg" | Décrire @ et démarrer un nouveau changement (style Git) |
Déplacement et édition de l’historique
| Commande | Description |
|---|
jj squash | Déplacer les changements de @ dans son parent |
jj squash -i | Choisir interactivement quoi écraser |
jj split | Diviser le commit actuel en deux |
jj rebase -d <dest> | Rebaser un changement sur une destination |
jj abandon <rev> | Supprimer un commit |
jj duplicate <rev> | Copier un commit ailleurs |
La fonctionnalité clé : Annulation
| Commande | Description |
|---|
jj op log | Lister chaque opération effectuée |
jj undo | Annuler la dernière opération |
jj op restore <id> | Restaurer le dépôt à un état d”opération précédent |
Parce que chaque commande est une opération, presque n”importe quoi peut être annulé — y compris les rebases et les abandons.
Signets et interopérabilité Git
| Commande | Description |
|---|
jj bookmark create main -r @ | Créer un signet (≈ branche Git) |
jj bookmark set main -r @ | Déplacer un signet vers un commit |
jj git fetch | Récupérer du remote Git |
jj git push | Pousser les signets vers le remote Git |
jj git push -c @ | Créer une branche distante à partir du changement actuel |
Revsets (Sélection de commits)
| Revset | Sélectionne |
|---|
@ | Commit de copie de travail |
@- | Parent de la copie de travail |
main | Le commit vers lequel pointe un signet |
mine() | Vos commits |
ancestors(@) | Tous les ancêtres de @ |
jj log -r "description(glob:'fix*')" | Commits dont le message correspond |
Workflows courants
# Adopter jj dans un dépôt Git existant, continuer à travailler avec les remotes Git
jj git init --colocate
jj log
# Faire un changement sans staging — juste éditer les fichiers, puis décrire
# (les fichiers sont automatiquement snapshottés dans @)
jj describe -m "Add feature"
jj new # démarrer le prochain changement
# Oups — annuler la dernière chose que vous avez faite (même un rebase)
jj undo
# Pousser le changement actuel comme une branche pour examen
jj bookmark create feature -r @
jj git push -c @
jj vs Git
| Aspect | Jujutsu (jj) | Git |
|---|
| Zone de staging | Aucune (la copie de travail est un commit) | Index/staging |
| Conflits | De première classe, committables | Doit résoudre avant de continuer |
| Annulation | Universelle via le journal des opérations | Reflog (partiel) |
| Branches | Signets (facultatif) | Branches (central) |
| Backend | Compatible Git | Git |
Ressources