The latest release of jj introduces groundbreaking features like the interactive 'arrange' command, intelligent bookmark advancement, and enhanced template capabilities, while maintaining its commitment to simplicity and power in version control.
The version control landscape continues to evolve, and jj's latest release v0.39.0 represents a significant milestone in the quest for a Git-compatible system that balances simplicity with powerful functionality. This release, spearheaded by thoughtpolice and contributed to by an impressive roster of 31 developers, introduces several groundbreaking features while maintaining the project's core philosophy of being both simple and powerful.
The Interactive Revolution: jj arrange
Perhaps the most exciting addition in this release is the jj arrange command, which brings an interactive TUI (Terminal User Interface) to the jj ecosystem. This feature allows developers to visually reorder and abandon revisions in a way that feels intuitive and efficient. The TUI approach represents a significant shift in how version control operations can be performed, moving beyond the traditional command-line paradigm to something more interactive and visual.
The arrange command addresses one of the most common pain points in version control: the need to reorganize commit history in a way that tells a coherent story. By providing a visual interface for this task, jj is making what was once a potentially error-prone and tedious process into something more accessible and less mentally taxing.
Intelligent Bookmark Management
Building on community feedback and inspired by the longstanding jj tug alias, the new jj bookmark advance command introduces intelligent bookmark advancement. This feature automatically moves bookmarks forward to a target revision (defaulting to the current revision), using customizable revsets for both the source and destination.
This enhancement demonstrates jj's commitment to learning from its community while pushing the boundaries of what's possible in version control. The ability to automatically advance bookmarks based on customizable criteria represents a significant step forward in workflow automation, potentially saving developers countless hours of manual bookmark management.
Template System Evolution
The template system in jj has received substantial upgrades in this release. The introduction of new methods like first(), last(), get(index), reverse(), skip(count), and take(count) on list types provides developers with unprecedented flexibility in manipulating lists within templates.
Additionally, the new builtin_draft_commit_description_with_diff template includes the diff in the commit description editor, making it easier to review changes while writing commit messages. This seemingly small enhancement can have a profound impact on code review quality and commit message accuracy.
The support for Serialize operations on the result of map() and if() functions further extends the template system's capabilities, allowing for more complex and dynamic template generation.
Enhanced Git Integration
The release includes several improvements to Git integration, including support for push options in jj git push with the --option flag. This allows users to pass options to the remote server when pushing commits, providing greater flexibility in how changes are distributed.
The change in how conflicted commits are represented in Git - now including files from the first side of the conflict - should prevent unchanged files from being highlighted as "added" in editors when checking out a conflicted commit in a colocated workspace. This is a subtle but important improvement that addresses a real-world pain point for developers working with conflicts.
Breaking Changes and Deprecations
As with any major release, v0.39.0 includes some breaking changes. The most significant is the dropping of support for legacy index files written by jj versions before 0.33. While this may cause some disruption for users on very old versions, it's a necessary step for the project's evolution.
The removal of deprecated config options (core.fsmonitor, core.watchman.register-snapshot-trigger) and the jj op undo command (replaced by jj op revert or jj undo/redo) demonstrates the project's commitment to maintaining a clean and modern codebase.
New Utilities and Commands
Several new commands and utilities have been introduced:
jj util snapshotprovides an official alternative to the previously-undocumentedjj debug snapshotcommandjj gerrit uploadnow supports a variety of new flags and can recognize Change-Id explicitly set via the alternative trailer Linkjj bookmark renamenow supports--overwrite-existingto allow renaming a bookmark even if the new name already exists- Conditional configuration based on environment variables with
--when.environments
Bug Fixes and Platform Improvements
The release addresses several important bugs, particularly on Windows where native file locks (LockFileEx) are now used instead of polling with file creation. This fixes issues with "pending delete" semantics that were leaving lock files stuck.
Additionally, jj now safely detaches the HEAD of alternate Git worktrees if their checked-out branch is moved or deleted during Git export, addressing a potential data integrity issue.
Community and Collaboration
The impressive list of 31 contributors for this release underscores the growing community around jj. From established contributors like thoughtpolice and steveklabnik to newcomers like Aaron Christiansen and Andy Brenneke, the diversity of contributors speaks to the project's broad appeal and the strength of its community.
Looking Forward
With v0.39.0, jj continues to push the boundaries of what's possible in version control while maintaining its commitment to simplicity. The introduction of interactive features like jj arrange, the evolution of the template system, and the improvements to Git integration all point to a project that's not content to simply replicate existing tools but is actively innovating in the space.
The deprecation of jj debug snapshot in favor of jj util snapshot (to be removed in v0.45.0) also shows a project that's maturing and establishing clear boundaries between stable features and development tools.
As jj continues to evolve, it will be fascinating to see how these new features are adopted by the community and what new workflows they enable. The balance between innovation and stability that jj strikes in this release suggests a bright future for this Git-compatible version control system.
For developers looking to explore these new features, the installation instructions provide a straightforward path to getting started with jj. Whether you're a long-time user or new to the project, v0.39.0 offers compelling reasons to dive in and experience the next generation of version control.

Comments
Please log in or register to join the discussion