Bookmarks sind keine Branches, und das ist der Punkt
Teil 8 von 9.
jjs benannte Zeiger “Bookmarks” statt “Branches” zu nennen sah anfangs nach
unnötigem Vokabular aus. Ist es nicht. Ein Git-Branch rückt jedes Mal automatisch
vor, wenn du committest, während er ausgecheckt ist, das Ref und deine aktuelle
Arbeitslinie sind dasselbe, bis du explizit wechselst. Ein jj-Bookmark ist davon
entkoppelt: Du kannst mehrere Commits über der letzten Stelle arbeiten, auf die ein
Bookmark zeigt, und es bleibt einfach dort, bis du es mit jj bookmark set
verschiebst oder indem du den Commit rebasierst, an den es angehängt ist.
Diese Entkopplung ist es, die die eigentliche Publish-Schleife leichter anfühlen lässt:
jj bookmark create feature-colors
jj git push --bookmark feature-colors
und, sobald ein PR gemerged wird und das main des Remotes sich bewegt,
jj git fetch
ist oft der gesamte “Aufholen”-Schritt, weil ein normaler Merge oder Squash-Merge
weiterhin ein Fast-Forward von der alten Spitze ist und ein getracktes Bookmark beim
Fetch fast-forwardet, ohne dass man es ihm sagen muss. Vergleiche das damit, sich
git branch -f oder git merge origin/main je nach Laune zu merken.
Das Detail, das ich am meisten schätzte, weil es eine ganze Kategorie von “habe ich
vergessen, den Branch-Zeiger zu aktualisieren”-Fehlern beseitigt: Einen Commit zu
rebasieren, auf den ein Bookmark zeigt, nimmt das Bookmark automatisch mit.
jj rebase -d main auf einem Feature-Commit verschiebt sein Bookmark in derselben
Operation mit. Und wenn das Rebase-Ziel bereits dieselbe Änderung enthält, die exakte
Situation nach einem Squash-Merge, merkt jj, dass der Diff bereits vorhanden ist, und
lässt den nun leeren Commit fallen, statt einen streunenden No-op-Commit
zurückzulassen, was der eine Teil des Git-Äquivalents ist, für den ich das Flag immer
vergesse (--skip-empty).
Nichts davon erforderte, den PR-basierten Workflow aufzugeben, den mein Team ohnehin verwendet. Es ist derselbe GitHub-Flow, derselbe Review-Prozess, derselbe Merge-Button. Nur die lokale Buchführung zwischen “ich habe ein paar Commits” und “das Remote spiegelt sie wider” wurde spürbar leichter.