Aller au contenu

Jujutsu (jj) - Feuille de triche système de contrôle de version compatible Git

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

PlateformeCommande
Cargocargo install --locked jj-cli
macOS (Homebrew)brew install jj
Arch Linuxsudo pacman -S jujutsu
Nixnix profile install nixpkgs#jujutsu
Windows (Scoop)scoop install jujutsu
Vérifierjj --version

Configuration

CommandeDescription
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 --colocateInitialiser jj dans un dépôt Git existant (garde .git)
jj git clone <url>Cloner un dépôt Git avec jj
jj git initCréer un nouveau dépôt jj (backend natif)

Concepts principaux

TermeSens
ChangeUn changement logique avec un ID de changement stable (survit aux réécritures)
CommitUn snapshot ; la copie de travail est toujours un commit (@)
@Le commit de copie de travail actuel
RevsetUn langage de requête pour sélectionner les commits
Operation logHistorique des opérations de dépôt, chacune annulable
BookmarkUn pointeur nommé (mappe à une branche Git à la poussée)

Workflow quotidien

CommandeDescription
jj statusAfficher les changements de copie de travail
jj logAfficher le graphique des commits
jj diffDiff du commit de copie de travail
jj describe -m "msg"Définir/remplacer le message du commit actuel
jj newDé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

CommandeDescription
jj squashDéplacer les changements de @ dans son parent
jj squash -iChoisir interactivement quoi écraser
jj splitDiviser 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

CommandeDescription
jj op logLister chaque opération effectuée
jj undoAnnuler 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

CommandeDescription
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 fetchRécupérer du remote Git
jj git pushPousser les signets vers le remote Git
jj git push -c @Créer une branche distante à partir du changement actuel

Revsets (Sélection de commits)

RevsetSélectionne
@Commit de copie de travail
@-Parent de la copie de travail
mainLe 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

AspectJujutsu (jj)Git
Zone de stagingAucune (la copie de travail est un commit)Index/staging
ConflitsDe première classe, committablesDoit résoudre avant de continuer
AnnulationUniverselle via le journal des opérationsReflog (partiel)
BranchesSignets (facultatif)Branches (central)
BackendCompatible GitGit

Ressources