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)