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 replaced jj checkout and jj merge. Whether you want to start a new change on one parent or create a merge commit with multiple parents, jj new is now the universal tool for creating working-copy commits.
  • Squash over Move: jj move was deprecated in favor of jj squash. The logic shifted toward "squashing" changes into other commits rather than "moving" them.
  • Abandonment Logic: jj has 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 push evolved 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 jj handles repositories that share a .git folder, 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 jj tracks 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 log view.
  • Short IDs: To reduce visual noise, jj implemented "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 log on large repositories.
  • TUI & Editors: jj now 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:

  1. Commands: Use jj new instead of checkout/merge; use jj squash instead of move.
  2. Revsets: The : operator was replaced by ::.
  3. Config: ui.default-revset was renamed to revsets.log.
  4. MSRV: The minimum required Rust version has been bumped several times (currently requiring 1.76.0+).