jj – CLI für Jujutsu
(steveklabnik.github.io)jj, die Kommandozeilenschnittstelle von Jujutsu, ist ein Tool auf Basis eines verteilten Versionsverwaltungssystems (DVCS)- Bietet einfachere und intuitivere, zugleich aber leistungsfähigere Funktionen als
git - Kombiniert die Stärken von
gitund Mercurial und reduziert so die Zahl der Kernwerkzeuge bei zugleich engerer, organischer Verzahnung - Verwendet ein
git-kompatibles Backend, sodass bestehende Kollaborationsumgebungen erhalten bleiben und dennoch unabhängige Experimente möglich sind - Für fortgeschrittene Nutzer ist besonders wichtig, dass sich zusätzliche Versionsverwaltungsfunktionen nutzen lassen, die mit
gitnur schwer umzusetzen sind
Einführung in jj und seine Merkmale
-
jjist die CLI (Kommandozeilenschnittstelle) von Jujutsu, und Jujutsu ist ein verteiltes Versionsverwaltungssystem (DVCS)- Nutzer sind möglicherweise mit anderen DVCS wie
gitvertraut, und das Tutorial setzt die Perspektive vongit-Nutzern voraus jjwurde als einfacheres, leichter nutzbares und zugleich leistungsstarkes Tool alsgitkonzipiert- Üblicherweise stehen sich „Leistungsfähigkeit“ und „Komplexität“ entgegen, doch
jjpräsentiert hierfür ein neues Gleichgewicht jjvereint die Stärken vongitund Mercurial (hg) und bildet damit eine neue Form von DVCS- Es reduziert die Zahl der Kernwerkzeuge und bietet durch die organische Verzahnung der einzelnen Werkzeuge eine effiziente Arbeitsumgebung
- Fortgeschrittene Nutzer können zusätzliche Versionsverwaltungsfunktionen verwenden, die mit
gitnur schwer möglich sind jjnutzt eingit-kompatibles Backend, sodass unabhängige Experimente möglich sind, ohne die Kollaborationsumgebung zu verändern- Die Kompatibilität mit bestehenden
git-Repos bleibt erhalten, und bei Bedarf lässt sich leicht zugitzurückkehren - Das Tutorial kündigt an, anhand dieser Eigenschaften direkt zu zeigen, warum
jjein beachtenswertes Tool ist
- Nutzer sind möglicherweise mit anderen DVCS wie
1 Kommentare
Hacker-News-Kommentare
Viele der Diskussionen konzentrieren sich auf die Unterschiede zwischen git und jj, aber ich denke, es ist besser, git einfach zu vergessen und sich auf den grundlegenden Workflow von jj zu konzentrieren
In einem sauberen Repository kann man mit
jjden Status prüfen, und nach Änderungen einfach mitjj commit -m "made changes"committenWenn man einen Fehler gemacht hat, korrigiert man ihn und fügt ihn mit
jj squashdem letzten Commit hinzuNur wenn man wie bei einem neuen Branch auf einer bestimmten Revision arbeiten will, braucht man
jj new -r lmnopDie git-Historie kann man mit
git logansehen, und die internen Abläufe von jj sind nicht sichtbaralias.save="!git add -A; git commit -m"angelegt, die ich dann als$ git save "made changes"nutzeJJ fühlt sich für mich so an, als würde es verlangen, rückwärts zu denken
In git schreibt man nach den Änderungen die Commit-Nachricht, während man in jj zuerst einen neuen Commit erstellt und ihn dann beschreibt
Ich bin es gewohnt, aus einem schmutzigen Zustand mit mehreren vermischten Features nur die nötigen Änderungen auszuwählen und zu committen, und nach dem jj-Tutorial bin ich nicht sicher, ob das möglich ist
jj newist so etwas wie ein leerer git-Staging-BereichIn jj existiert immer ein Commit, und dieser Commit hat anhand des Ordnerinhalts eine berechnete stabile Change-ID
Wenn man mehrere Änderungen aufteilen und separat committen möchte, kann man
jj splitverwendenjj newtemporäre Commits und lasse die Nachricht leerSpäter, wenn alles bereit ist, squashe ich mehrere Commits zu einem und füge eine Nachricht hinzu
Diese Methode funktioniert wie eine Art Undo-Historie und macht Experimente viel angenehmer
jj neweinfach nur „oben einen neuen Commit erstellen“, also muss man nicht sofort eine Beschreibung schreibenIch habe am Anfang auch versucht, mir das anzugewöhnen, aber das war eher ineffizient
Auch für Git wurde ein ähnlicher Workflow empfohlen, und mit dem Squash Workflow lässt sich ein Ablauf aufbauen, der dem Git-Index ähnelt
Deshalb nutze ich mehrere Workspaces und häufig die shelve-Funktion von IntelliJ
Manchmal speichere ich Diffs auch temporär als git-Patch
Diesen chaotischen Prozess versuche ich vor meinen Kollegen zu verbergen, um etwas professioneller zu wirken
Was mir an jj nach dem Ausprobieren nicht gefällt, ist, dass Dateibearbeitungen automatisch committet werden
Wenn ich zum Durchsehen alter Commits ein Checkout mache und dann Dateien ändere, wird dieser Commit verändert und die gesamte nachfolgende Historie neu rebased
Deshalb muss ich vorsichtshalber einen neuen leeren Commit anlegen
Bei git ist das angenehmer, weil sich das Repository nicht verändert, bis ich ausdrücklich committe
jj evologkennengelernt habe, hat sich das geändertjj hatte bereits eine bessere Lösung als Staging
Meine Vertrautheit mit der git-CLI war eher ein Hindernis beim Lernen von jj
Interessanterweise versteht man mit jj auch die Architektur der Storage-Engine von git besser
editjj newverwendet, lassen sich Änderungen sauber verfolgenDas fühlt sich viel besser an, als mit dem git-stash zu jonglieren
jj editist die größte Falle von jjStattdessen sollte man
jj newverwenden, und wenn etwas schiefgeht, kann man es mitjj undowiederherstellenjj behandelt Commits als billige Snapshots, daher sollte man sich eher auf „Änderungen“ als auf Commits konzentrieren
Automatisches Rebase wird nach dem Push unveränderlich fixiert und ist damit sicher
Mit
jj newundjj squashkann man das wie die Branch-Heads in git verwaltenjj macht es leicht, in einem Detached-Head-Zustand zu arbeiten
jj editeinen älteren Commit ausgechecktWenn du auf
jj newumsteigst, sollte das Problem verschwindenDer letzte Absatz zu jj ist der Kernpunkt
Es verwendet ein vollständig kompatibles Backend zu git, daher kann man es allein ausprobieren, ohne dass das ganze Team umsteigen muss
Wenn es einem nicht gefällt, kann man jederzeit zu git zurückkehren
Git-Operationen werden nicht im jj-Log erfasst und müssen manuell importiert werden
Für ein Projekt wird empfohlen, nur eine Schnittstelle zu verwenden
Mein Lieblingsfeature ist eindeutig
jj absorbEs verschiebt Änderungen aus der aktuellen Revision automatisch in frühere passende Commits
Das ist nützlich, wenn man zum Beispiel vergessen hat, die Konfigurationsdatei oder
.gitignoreanzupassenMan macht
jj new, nimmt die Änderungen vor und führt dannjj absorbausUnd das Beste daran ist, dass man sich nicht mit Merge-Konflikten herumschlagen muss
jj absorbetwas falsch zuordnet, kann man es mitjj undorückgängig machenDank dieser Funktion wirken selbst komplexe Rebases nicht mehr einschüchternd
git absorbIch konnte das Tutorial lange nicht aktualisieren, benutze jj aber immer noch täglich
Im Startup ersc.io war ich zu beschäftigt, um an Upstream zu arbeiten
Fragen sind jederzeit willkommen
jj verwendet stabile Change-IDs, git dagegen unveränderliche Commit-IDs
Deshalb fühlen sich Undo und Rebase in jj viel flexibler an
Manchmal möchte ich aber mehr Änderungen sehen und frage mich, ob es eine Option gibt, sie alle auf einmal anzuzeigen
jj unterscheidet sich genug von git, dass es einen Versuch wert ist
Schon allein eine andere Herangehensweise kennenzulernen, erweitert den ingenieurtechnischen Horizont
Man muss nicht alles ausprobieren, aber es ist wichtig, die Trade-offs verschiedener Workflows zu verstehen
Die Beziehung zwischen git und jj fühlt sich an wie die zwischen C und Python
git ist forensische Nachverfolgung, jj eher Kapitel einer Geschichte
Manchmal muss man frühe Kapitel umschreiben, damit spätere natürlicher wirken
jj ist mit der Philosophie entworfen, dass „der Working Tree selbst ein Commit ist“ und dass man „sogar Konflikte committen kann“
Bei der Behauptung „mächtiger und einfacher“ finde ich, dass konkrete Beispiele nötig sind
Wenn man so etwas nicht braucht, spürt man den Wert von jj vielleicht nicht
Man versteht das erst, wenn man es selbst benutzt
jj undoallein ist den Einsatz wertIn git landet man leicht in einem Zustand, der sich nicht wiederherstellen lässt, während in jj ein paar Undo-Schritte oft genügen
Dank jj bin ich viel sicherer im Umgang mit nichtlinearen DAGs geworden
Ich gehe frei mit Änderungen um, die mehrere Eltern oder Kinder haben
Früher habe ich unnötig eine Reihenfolge erzwungen, jetzt kann ich Abhängigkeiten klar ausdrücken
Auch Review und Einreichung sind dadurch deutlich effizienter