Jujutsu (jj) - Foglio di aiuto per il sistema di controllo della versione compatibile con Git
Jujutsu (jj) è un moderno sistema di controllo della versione che è compatibile con Git — usa un repository Git come backend, quindi puoi adottarlo su repo esistenti e interoperare con i compagni di squadra che usano Git. Il suo modello è diverso e, per molti, più semplice: la copia di lavoro è essa stessa un commit (nessuna area di staging separata), i conflitti sono oggetti di prima classe che puoi eseguire il commit e risolvere più tardi, e ogni operazione è registrata in un log delle operazioni che puoi annullare. Non ci sono rami nel senso Git per impostazione predefinita; lavori con modifiche identificate da ID di modifica stabili.
Installation
| Platform | Command |
|---|
| 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 |
| Verify | jj --version |
Setup
| Command | Descrizione |
|---|
jj config set --user user.name "Your Name" | Imposta il tuo nome |
jj config set --user user.email "you@example.com" | Imposta la tua email |
jj git init --colocate | Inizializza jj in un repo Git esistente (mantiene .git) |
jj git clone <url> | Clona un repo Git con jj |
jj git init | Crea un nuovo repo jj (backend nativo) |
Concetti principali
| Term | Significato |
|---|
| Change | Una modifica logica con un ID di modifica stabile (sopravvive alle riscritture) |
| Commit | Uno snapshot; la copia di lavoro è sempre un commit (@) |
@ | Il commit della copia di lavoro corrente |
| Revset | Un linguaggio di query per selezionare i commit |
| Operation log | Cronologia delle operazioni del repository, ognuna annullabile |
| Bookmark | Un puntatore denominato (mappa su un ramo Git al push) |
Flusso di lavoro quotidiano
| Command | Descrizione |
|---|
jj status | Mostra i cambiamenti della copia di lavoro |
jj log | Mostra il grafico dei commit |
jj diff | Diff del commit della copia di lavoro |
jj describe -m "msg" | Imposta/sostituisce il messaggio del commit corrente |
jj new | Avvia una nuova modifica in cima a quella corrente |
jj new <rev> | Avvia una nuova modifica in cima a un commit specifico |
jj edit <rev> | Rendi un commit esistente la copia di lavoro |
jj commit -m "msg" | Descrivi @ e avvia una nuova modifica (stile Git) |
Spostamento e modifica della cronologia
| Command | Descrizione |
|---|
jj squash | Sposta le modifiche da @ nel suo genitore |
jj squash -i | Scegli interattivamente cosa appiattire |
jj split | Dividi il commit corrente in due |
jj rebase -d <dest> | Rebase una modifica su una destinazione |
jj abandon <rev> | Scarta un commit |
jj duplicate <rev> | Copia un commit altrove |
La caratteristica killer: Annulla
| Command | Descrizione |
|---|
jj op log | Elenca ogni operazione eseguita |
jj undo | Annulla l”ultima operazione |
jj op restore <id> | Ripristina il repository a uno stato di operazione precedente |
Poiché ogni comando è un”operazione, quasi tutto può essere annullato — inclusi i rebase e gli abbandoni.
Bookmark e interoperabilità Git
| Command | Descrizione |
|---|
jj bookmark create main -r @ | Crea un bookmark (≈ ramo Git) |
jj bookmark set main -r @ | Sposta un bookmark a un commit |
jj git fetch | Fetch dal repository remoto Git |
jj git push | Spingilo i bookmark al repository remoto Git |
jj git push -c @ | Crea un ramo remoto dalla modifica corrente |
Revsets (selezione dei commit)
| Revset | Seleziona |
|---|
@ | Commit della copia di lavoro |
@- | Genitore della copia di lavoro |
main | Il commit a cui punta un bookmark |
mine() | I tuoi commit |
ancestors(@) | Tutti gli antenati di @ |
jj log -r "description(glob:'fix*')" | Commit il cui messaggio corrisponde |
Flussi di lavoro comuni
# Adopt jj in an existing Git repo, keep working with Git remotes
jj git init --colocate
jj log
# Make a change without staging — just edit files, then describe
# (files are auto-snapshotted into @)
jj describe -m "Add feature"
jj new # start the next change
# Oops — undo the last thing you did (even a rebase)
jj undo
# Push the current change as a branch for review
jj bookmark create feature -r @
jj git push -c @
jj vs Git
| Aspetto | Jujutsu (jj) | Git |
|---|
| Area di staging | Nessuno (copia di lavoro è un commit) | Index/staging |
| Conflitti | Di prima classe, committabili | Deve risolvere prima di procedere |
| Annulla | Universale tramite log op | Reflog (parziale) |
| Rami | Bookmark (opzionale) | Rami (centrale) |
| Backend | Compatibile con Git | Git |
Resources