v0.31.0

jj-vcs/jjv0.31.0Jul 2, 2025by ilyagr

AI Summary

Revset expressions now search hidden revisions and their ancestors by default, commit templates no longer normalize descriptions, and ANSI 256-color palette support has been added.

Key Highlights

  • Revset expressions now search hidden revisions and their ancestors
  • Commit templates no longer normalize descriptions by appending a final newline
  • ANSI 256-color palette can be used when configuring colors

Breaking Changes

  • Revset expressions like `hidden_id | description(x)` now search the specified hidden revision and its ancestors
  • Commit templates no longer normalize `description` by appending final newline

New Features

  • New `change_id(prefix)`/`commit_id(prefix)` revset functions to explicitly query commits by prefix
  • `parents()` and `children()` revset functions now accept an optional `depth` argument
  • `jj evolog` can now follow changes from multiple revisions
  • Log node templates are now specified in toml rather than hardcoded
  • Templates now support `json(x)` function to serialize values in JSON format

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.31.0/install-and-setup/) to get started.

### Breaking changes

* Revset expressions like `hidden_id | description(x)` now [search the specified
  hidden revision and its ancestors](docs/revsets.md#hidden-revisions) as well
  as all visible revisions.

* Commit templates no longer normalize `description` by appending final newline
  character. Use `description.trim_end() ++ "\n"` if needed.

### Deprecations

* The `git.push-bookmark-prefix` setting is deprecated in favor of
  `templates.git_push_bookmark`, which supports templating. The old setting can
  be expressed in template as `"<prefix>" ++ change_id.short()`.

### New features

* New `change_id(prefix)`/`commit_id(prefix)` revset functions to explicitly
  query commits by change/commit ID prefix.

* The `parents()` and `children()` revset functions now accept an optional
  `depth` argument. For instance, `parents(x, 3)` is equivalent to `x---`, and
  `children(x, 3)` is equivalent to `x+++`.

* `jj evolog` can now follow changes from multiple revisions such as divergent
  revisions.

* `jj diff` now accepts `-T`/`--template` option to customize summary output.

* Log node templates are now specified in toml rather than hardcoded.

* Templates now support `json(x)` function to serialize values in JSON format.

* The ANSI 256-color palette can be used when configuring colors. For example,
  `colors."diff removed token" = { bg = "ansi-color-52", underline = false }`
  will apply a dark red background on removed words in diffs.

### Fixed bugs

* `jj file annotate` can now process files at a hidden revision.

* `jj op log --op-diff` no longer fails at displaying "reconcile divergent
  operations." [#4465](https://github.com/jj-vcs/jj/issues/4465)

* `jj util gc --expire=now` now passes the corresponding flag to `git gc`.

* `change_id`/`commit_id.shortest()` template functions now take conflicting
  bookmark and tag names into account.
  [#2416](https://github.com/jj-vcs/jj/issues/2416)

* Fixed lockfile issue on stale file handles observed with NFS.

### Packaging changes

* `aarch64-windows` builds (release binaries and `main` snapshots) are now provided.

### Contributors

Thanks to the people who made this release happen!

* Anton Älgmyr (@algmyr)
* Austin Seipp (@thoughtpolice)
* Benjamin Brittain (@benbrittain)
* Cyril Plisko (@imp)
* Daniel Luz (@mernen)
* Gaëtan Lehmann (@glehmann)
* Gilad Woloch (@giladwo)
* Greg Morenz (@gmorenz)
* Igor Velkov (@iav)
* Ilya Grigoriev (@ilyagr)
* Jade Lovelace (@lf-)
* Jonas Greitemann (@jgreitemann)
* Josh Steadmon (@steadmon)
* juemrami (@juemrami)
* Kaiyi Li (@06393993)
* Lars Francke (@lfrancke)
* Martin von Zweigbergk (@martinvonz)
* Osama Qarem (@osamaqarem)
* Philip Metzger (@PhilipMetzger)
* raylu (@raylu)
* Scott Taylor (@scott2000)
* Vincent Ging Ho Yim (@cenviity)
* Yuya Nishihara (@yuja)