Jujutsu (jj) - Git-kompatibler Versionskontroll Cheatsheet
Jujutsu (jj) ist ein modernes Versionskontrollsystem, das Git-kompatibel ist — es nutzt ein Git-Repository als Backend, daher können Sie es in bestehenden Repos übernehmen und mit Teamkollegen interoperieren, die Git verwenden. Sein Modell ist anders und für viele einfacher: die Working Copy ist selbst ein Commit (kein separater Staging Area), Konflikte sind First-Class Objekte, die Sie später committen und auflösen können, und jede Operation wird in einem Operations-Protokoll aufgezeichnet, das Sie rückgängig machen können. Es gibt standardmäßig keine Branches im Git-Sinne; Sie arbeiten mit Änderungen, die durch stabile Change IDs gekennzeichnet sind.
Installation
| Plattform | Befehl |
|---|
| 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 |
| Verifizieren | jj --version |
Einrichtung
| Befehl | Beschreibung |
|---|
jj config set --user user.name "Your Name" | Ihren Namen setzen |
jj config set --user user.email "you@example.com" | Ihre E-Mail setzen |
jj git init --colocate | Jj in einem bestehenden Git-Repo initialisieren (behält .git) |
jj git clone <url> | Ein Git-Repo mit jj klonen |
jj git init | Ein neues jj-Repo erstellen (natives Backend) |
Kernkonzepte
| Term | Bedeutung |
|---|
| Change | Eine logische Änderung mit stabiler Change ID (übersteht Umschreibungen) |
| Commit | Ein Snapshot; die Working Copy ist immer ein Commit (@) |
@ | Der aktuelle Working-Copy Commit |
| Revset | Eine Abfragesprache zum Auswählen von Commits |
| Operation log | Verlauf von Repo-Operationen, jede rückgängig machbar |
| Bookmark | Ein benannter Zeiger (wird beim Push zu einem Git-Branch) |
Alltäglicher Workflow
| Befehl | Beschreibung |
|---|
jj status | Working-Copy Änderungen anzeigen |
jj log | Das Commit-Diagramm anzeigen |
jj diff | Diff des Working-Copy Commits |
jj describe -m "msg" | Die aktuelle Commit-Nachricht setzen/ersetzen |
jj new | Eine neue Änderung auf der aktuellen starten |
jj new <rev> | Eine neue Änderung auf einem bestimmten Commit starten |
jj edit <rev> | Einen bestehenden Commit zur Working Copy machen |
jj commit -m "msg" | @ beschreiben und eine neue Änderung starten (Git-ähnlich) |
History verschieben und bearbeiten
| Befehl | Beschreibung |
|---|
jj squash | Änderungen von @ in seinen Parent verschieben |
jj squash -i | Interaktiv auswählen, was zu squashen ist |
jj split | Den aktuellen Commit in zwei aufteilen |
jj rebase -d <dest> | Eine Änderung auf ein Ziel rebasen |
jj abandon <rev> | Einen Commit löschen |
jj duplicate <rev> | Einen Commit an anderer Stelle kopieren |
Die Killer-Funktion: Undo
| Befehl | Beschreibung |
|---|
jj op log | Jede durchgeführte Operation auflisten |
jj undo | Die letzte Operation rückgängig machen |
jj op restore <id> | Das Repo zu einem vorherigen Operationsstatus wiederherstellen |
Da jeder Befehl eine Operation ist, können fast alle rückgängig gemacht werden — einschließlich Rebases und Aufgaben.
Bookmarks und Git Interop
| Befehl | Beschreibung |
|---|
jj bookmark create main -r @ | Ein Bookmark erstellen (≈ Git Branch) |
jj bookmark set main -r @ | Ein Bookmark auf einen Commit verschieben |
jj git fetch | Von der Git-Remote abrufen |
jj git push | Bookmarks zur Git-Remote pushen |
jj git push -c @ | Einen Remote-Branch aus der aktuellen Änderung erstellen |
Revsets (Commits auswählen)
| Revset | Wählt |
|---|
@ | Working-Copy Commit |
@- | Parent der Working Copy |
main | Den Commit, auf den ein Bookmark zeigt |
mine() | Ihre Commits |
ancestors(@) | Alle Ancestors von @ |
jj log -r "description(glob:'fix*')" | Commits, deren Nachricht passt |
Häufige Arbeitsabläufe
# Jj in einem bestehenden Git-Repo übernehmen, weiterhin mit Git-Remotes arbeiten
jj git init --colocate
jj log
# Machen Sie eine Änderung ohne zu staggen — bearbeiten Sie einfach Dateien, dann beschreiben Sie
# (Dateien werden automatisch in @ gespeichert)
jj describe -m "Add feature"
jj new # start the next change
# Oops — die letzte Sache, die Sie getan haben, rückgängig machen (auch ein Rebase)
jj undo
# Den aktuellen Change als Branch für Review pushen
jj bookmark create feature -r @
jj git push -c @
jj vs. Git
| Aspekt | Jujutsu (jj) | Git |
|---|
| Staging Area | Keine (Working Copy ist ein Commit) | Index/Staging |
| Konflikte | First-Class, commitable | Müssen vor dem Fortfahren gelöst werden |
| Undo | Universal via Op Log | Reflog (partiell) |
| Branches | Bookmarks (optional) | Branches (zentral) |
| Backend | Git-kompatibel | Git |
Ressourcen