Below is a synthesized summary of the most significant evolutions across the versions provided.
---
🚀 Major Architectural & Workflow Shifts
The most important trend in jj's development has been consolidation. Instead of having many specialized commands, jj has moved toward a few powerful, generalized ones:
- The Rise of
jj new: This command has effectively replacedjj checkoutandjj merge. Whether you want to start a new change on one parent or create a merge commit with multiple parents,jj newis now the universal tool for creating working-copy commits. - Squash over Move:
jj movewas deprecated in favor ofjj squash. The logic shifted toward "squashing" changes into other commits rather than "moving" them. - Abandonment Logic:
jjhas refined how it handles empty/undescribed commits, moving toward automatically abandoning them when you move away from them to keep the history clean. - Open vs. Closed Commits: Early versions experimented with "open commits" (commits that remain editable). The tool eventually disabled this by default, shifting toward a workflow where every change is a distinct commit that can be rewritten.
🛠️ Git Integration & Interoperability
Since jj often acts as a frontend for Git, much of the development focused on making this "colocation" seamless:
- Safety in Pushing:
jj git pushevolved to include safety checks similar to Git's--force-with-lease, ensuring you don't accidentally overwrite remote work. - Colocated Repos: Significant improvements were made to how
jjhandles repositories that share a.gitfolder, improving the import/export of branches and tags. - Commit Signing: Added support for GnuPG and SSH signing to maintain compatibility with corporate Git requirements.
- Branch Management: The way
jjtracks remote branches has been rewritten several times to better distinguish between local "jj" branches and remote-tracking Git branches.
🔍 Revsets & Templating (The "Power User" Suite)
One of jj's standout features is its query language (revsets) and customizable output (templates).
- Revset Expansion: Added complex functions like
reachable(),mutable(),immutable(), and glob matching for authors and descriptions. This allows users to find specific commits with surgical precision. - Template Engine: The log output is now almost entirely customizable. Users can define their own colors (including RGB hex), change graph symbols, and create complex conditional formatting for the
jj logview. - Short IDs: To reduce visual noise,
jjimplemented "short prefixes" for Change IDs, allowing users to identify commits by a few characters rather than long hashes.
⚡ Technical Improvements & UX
- Performance: A major overhaul of how conflicts are stored significantly sped up
jj logon large repositories. - TUI & Editors:
jjnow bundles its own TUI tools for diffing and merging, reducing the dependency on external software like Meld. - Configuration: Moved from a single config file to following XDG standards (across Linux, macOS, and Windows) and introduced TOML-based configuration for aliases.
- Conflict Handling: Conflict markers were updated to include explanations of what each part of the conflict represents, making resolution more intuitive.
⚠️ Key Breaking Changes for Users
If you are upgrading from an older version, these are the most critical points:
- Commands: Use
jj newinstead ofcheckout/merge; usejj squashinstead ofmove. - Revsets: The
:operator was replaced by::. - Config:
ui.default-revsetwas renamed torevsets.log. - MSRV: The minimum required Rust version has been bumped several times (currently requiring 1.76.0+).
Groetjes,