v0.32.0

jj-vcs/jjv0.32.0Aug 6, 2025by thoughtpolice

AI Summary

Symbol expressions in revsets now error out if resolved to multiple revisions, `jj op abandon` now discards unreachable versions of changes, and workspace list output can now be customized via templates.

Key Highlights

  • Symbol expressions in revsets no longer resolve to multiple revisions
  • `jj op abandon` now discards previous versions of changes if they become unreachable
  • Workspace list output can now be customized via templates

Breaking Changes

  • In revsets, symbol expressions no longer resolve to multiple revisions
  • `jj op abandon` now discards previous versions of a change if they become unreachable
  • The previously predefined `amend` alias has been removed
  • `commit.working_copies()` template method now returns `List<WorkspaceRef>`

New Features

  • `jj workspace list` now accepts `-T`/`--template` option
  • Added `templates.workspace_list` template
  • Merge tools config can now explicitly forbid using them as diff editors
  • Glob patterns now support `{foo,bar}` syntax
  • New `bisect(x)` revset function to help bisect a range of commits
  • New `first_parent()` and `first_ancestors()` revset functions

Full Release Notes

### About

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

### Breaking changes

* In revsets, symbol expressions (such as change ID prefix) no longer resolve to
  multiple revisions, and error out if resolved to more than one revisions. Use
  `change_id(prefix)` or `bookmarks(exact:name)` to query divergent changes or
  conflicted bookmarks. Commands like `jj rebase` no longer require `all:` to
  specify multiple destination revisions.

* `jj op abandon` now discards previous versions of a change (or predecessors)
  if they become unreachable from the operation history. The evolution history
  is truncated accordingly.

  Once `jj op abandon` and `jj util gc` are run in a repository, old versions of
  `jj` might get "commit not found" error on `jj evolog`.

* `commit.working_copies()` template method now returns `List<WorkspaceRef>`

* The previously predefined `amend` alias has been removed. You can restore it
  by setting the config `aliases.amend = ["squash"]`.

### Deprecations

* The `all:` revset modifier and `ui.always-allow-large-revsets` setting is
  planned to be removed in a future release.
  [#6016](https://github.com/jj-vcs/jj/issues/6016)

* Rename the `core.fsmonitor` and `core.watchman` settings to
  `fsmonitor.backend`, and `fsmonitor.watchman` respectively.

### New features

* `jj workspace list` now accepts `-T`/`--template` option to customize its
  output via templates.

* Added `templates.workspace_list` template to customize the output of
  `jj workspace list`.

* `jj fix` now buffers the standard error stream from subprocesses and emits
  the output from each all at once. The file name is printed before the output.

* `jj status` now collapses fully untracked directories into one line.
  It still fully traverses them while snapshotting but they won't clutter up
  the output with all of their contents.

* Add the `working-copy.eol-conversion` config which is similar to the git
  `core.autocrlf` config. A heuristics is used to detect if a file is a binary
  file to prevent the EOL conversion from changing binary files unexpectedly.

* Add a `.parents()` method to the
  [`Operation`](docs/templates.md#operation-type) type in the templating
  language.

* Merge tools config can now explicitly forbid using them as diff editors or
  diff formatters. Built-in tools that do not function well as diff editing
  tools or as diff formatters will now report an error when used as such.

* `jj diffedit` now accepts filesets to edit only the specified paths.

* AnnotationLine objects in templates now have a `original_line_number() ->
  Integer` method.

* Commit templates now support `.files()` to list all existing files at that
  revision.

* Glob patterns now support `{foo,bar}` syntax. There may be subtle behavior
  changes as we use the [globset](https://crates.io/crates/globset) library now.

* The new `bisect(x)` revset function can help bisect a range of commits to
  find when a bug was introduced.

* New `first_parent()` and `first_ancestors()` revset functions which are
  similar to `parents()` and `ancestors()`, but only traverse the first parent
  of each commit (similar to Git's `--first-parent` option).

* New `signing.backends.ssh.revocation-list` config for specifying a list of revoked
  public keys for commit signature verification.

* `jj fix` commands now replace `$root` with the workspace's root path. This is
  useful for tools stored inside the workspace.

### Fixed bugs

* Fixed an error in `jj util gc` caused by the empty blob being missing from
  the Git store. [#7062](https://github.com/jj-vcs/jj/issues/7062)

* `jj op diff -p` and `jj op log -p` now show content diffs from the first
  predecessor only. [#7090](https://github.com/jj-vcs/jj/issues/7090)

* `jj git fetch` no longer shows `NaN%` progress when connecting to slow remotes.
  [#7155](https://github.com/jj-vcs/jj/issues/7155)

### Contributors

Thanks to the people who made this release happen!

* adamnemecek (@adamnemecek)
* Alexander Kobjolke (@jakalx)
* Apromixately (@Apromixately)
* Austin Seipp (@thoughtpolice)
* Bryce Berger (@bryceberger)
* Daniel Danner (@dnnr)
* Daniel Luz (@mernen)
* Evan Martin (@evmar)
* George Christou (@gechr)
* George Elliott-Hunter (@george-palmsens)
* Hubert Głuchowski (@afishhh)
* Ilya Grigoriev (@ilyagr)
* Jade Lovelace (@lf-)
* Jake Martin (@jake-m-commits)
* Jan Klass (@Kissaki)
* Joaquín Triñanes (@JoaquinTrinanes)
* Josh Steadmon (@steadmon)
* Kaiyi Li (@06393993)
* Martin von Zweigbergk (@martinvonz)
* Nigthknight (@nigthknight)
* Ori Avtalion (@salty-horse)
* Pablo Brasero (@pablobm)
* Pavan Kumar Sunkara (@pksunkara)
* Philip Metzger (@PhilipMetzger)
* phoebe (@phoreverpheebs)
* Remo Senekowitsch (@senekor)
* Scott Taylor (@scott2000)
* Stephen Jennings (@jennings)
* Theo Buehler (@botovq)
* Tyarel8 (@Tyarel8)
* Yuya Nishihara (@yuja)