v0.45.0

jj-vcs/jjv0.45.0Sep 3, 2026by jennings

AI Summary

This release introduces the new `jj converge` command for automatic resolution of divergent commits, updates configuration handling to target the first loaded file by default, and adds internal tracking of Git HEAD per worktree to support multiple Git worktrees.

Key Highlights

  • New `jj converge` command for automatically resolving divergent commits
  • Git HEAD state is now tracked per worktree internally
  • Config commands now target the first loaded user configuration file

Breaking Changes

  • `jj config {edit,set,unset} --user` now targets the first loaded user configuration file instead of prompting interactively
  • `jj git import` in non-colocated repositories no longer imports commits from a detached Git HEAD branch

New Features

  • The new `jj converge` command attempts to automatically resolve divergence by creating a new commit
  • `jj bisect` now mentions when it cannot unambiguously find the first bad revision
  • `jj config {edit,set,unset}` now support a `--file <PATH>` option to target a specific configuration file
  • The default pager flags now include `-K` (`--quit-on-intr`) for cleaner Ctrl+C handling

Full Release Notes

### About

jj is a Git-compatible version control system that is both simple and powerful. See
the [installation instructions](https://docs.jj-vcs.dev/v0.45.0/install-and-setup/) to get started.

### Release highlights

* A new `jj converge` command was added to help automatically resolve divergent
  commits by combining them appropriately.

### Breaking changes

* `jj config {edit,set,unset} --user` now targets the first loaded user
  configuration file (e.g. `~/.config/jj/config.toml` or the first file in
  `conf.d/`) instead of prompting interactively when multiple files exist.
  Use `--file <PATH>` to target a specific config file.

* `jj git import` in non-colocated repositories no longer imports commits from a
  detached Git HEAD branch.

### Deprecations

None

### New features

* The new `jj converge` command attempts to automatically resolve divergence by
  creating a new commit that replaces the divergent commits. It applies
  heuristics to try to automatically come up with a good solution, and falls
  back to prompting the user if the heuristics are inconclusive. It can also run
  in non-interactive mode, which aborts if prompting would be needed.

* `jj bisect` will now mention when it cannot unambiguously find the first bad
  revision due to skips in evaluation.

* Git HEAD state is now tracked per worktree internally. This prepares
  colocated repositories for support of multiple Git worktrees, where each
  jj workspace can have its own Git HEAD. Existing repositories are migrated
  automatically.

* `jj config {edit,set,unset}` now support a `--file <PATH>` option to
  target a specific configuration file (such as files inside a `conf.d/`
  directory or loaded via `--config-file`). This allows precise file targeting
  and avoids interactive prompts when multiple config files exist.

### Fixed bugs

* [The default `immutable_heads()` set](docs/config.md#set-of-immutable-commits)
  now includes `untracked_remote_tags()`.

* `jj arrange` now scrolls the viewport to keep the selected commit visible
  when the commit stack is taller than the terminal.
  [#9033](https://github.com/jj-vcs/jj/issues/9033).

* The default pager flags now include `-K` (`--quit-on-intr`), so pressing
  Ctrl+C in `less` exits cleanly instead of leaving the terminal in a
  corrupted state (raw mode, visible escape sequences, broken input).

* A side of a conflict whose contents end with a carriage return no longer loses
  that byte when the materialized conflict is parsed back, such as when a
  conflicted file is snapshotted from the working copy.
  [#9868](https://github.com/jj-vcs/jj/issues/9868)

* In colocated workspaces, `jj workspace update-stale` now correctly resets the
  Git HEAD to the parent of the fresh working-copy commit.
  [#9936](https://github.com/jj-vcs/jj/issues/9936)

* `jj run` no longer runs against the remaining revisions if a process exits
  with a nonzero exit code.

* Fixed crash in `jj log` involving hidden revisions and the
  `log-graph-prioritize` revset.
  [#9975](https://github.com/jj-vcs/jj/issues/9975)

* In colocated repos, an external `git add` after a `jj` command no longer
  produces a tree with duplicate entries (`git fsck: duplicateEntries`). `jj`
  was leaving a stale cache-tree behind in `.git/index`. Repositories already
  corrupted this way are not repaired by the fix.
  [#9711](https://github.com/jj-vcs/jj/issues/9711)
  [#8884](https://github.com/jj-vcs/jj/issues/8884)

### Contributors

Thanks to the people who made this release happen!

* Aaron Bies (@slerpyyy)
* aaronabbott (@aabmass)
* Alexander Chen (@alexuser)
* Austin Seipp (@thoughtpolice)
* Baptiste Girardeau (@baptiste0928)
* Caleb White (@calebdw)
* Daniel Danner (@dnnr)
* David Rieber (@drieber)
* Gaëtan Lehmann (@glehmann)
* Gasper Stukelj (@mirkomartn)
* hexbinoct (@hexbinoct)
* Joseph Lou (@josephlou5)
* Keane Nguyen (@keanemind)
* LOG (@logarithmone1128)
* Martin von Zweigbergk (@martinvonz)
* OlshaMB (@OlshaMB)
* Philip Metzger (@PhilipMetzger)
* Priyanka Mandloi
* Remo Senekowitsch (@senekor)
* Riccardo Mazzarini (@noib3)
* Scott Sudharsan (@scott2000)
* sofia (@badp)
* Stephen Jennings (@jennings)
* Vaghinak Vardanyan (@vaghinak-vardanyan)
* Vincent Ging Ho Yim (@cenviity)
* Wang Yuantao (@0WD0)
* Yuya Nishihara (@yuja)