v0.34.0

jj-vcs/jjv0.34.0Oct 1, 2025by thoughtpolice

AI Summary

This release adds support for uploading changes to Gerrit Code Review and introduces automated bisection with jj bisect run. Git-based repositories are now colocated by default, and conflicts written by jj < 0.11 are no longer supported.

Key Highlights

  • Support for jj gerrit upload to submit changes to Gerrit Code Review
  • Automated bisection using jj bisect run
  • Git repositories colocated by default
  • Conflicts from jj < 0.11 no longer supported
  • MSRV raised to 1.88

Breaking Changes

  • Git-based repositories colocated by default (configure git.colocate=false to disable)
  • Conflicts written by jj < 0.11 appear as regular files with .jjconflict suffix
  • MSRV is now 1.88

New Features

  • jj bisect run for binary search to find bug-introducing commit
  • Default editor on Unix is now nano instead of pico
  • merge.hunk-level = "word" for word-level merging
  • merge.same-change = "keep" to disable lossy resolution
  • string.replace() method with regex and capture groups
  • hyperlink(url, text) template alias using OSC8 escape sequences
  • --when.platforms conditional configuration
  • External diff commands support $width substitution variable
  • jj gerrit upload command for Gerrit Code Review
  • jj bookmark create/set/move use working copy as default
  • exactly(x, n) revset function
  • jj util exec matches exit status and sets JJ_WORKSPACE_ROOT
  • jj config get supports array and table values

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

### Release highlights

* Support for uploading changes to Gerrit Code Review with `jj gerrit upload`.
  This lets you submit trees or multiple stacks of work at once. Support
  for fetching changes, submitting changes, and other operations is not yet
  implemented. This should be considered experimental, and we welcome feedback
  on using it.

* Support for automated bisection using `jj bisect run`; this will continuously
  bisect a commit range until a given commit is found to trigger a bug.

### Breaking changes

* Git-based repositories are now colocated by default. Configure `git.colocate =
  false` to keep the previous behavior.

* Conflicts written by jj < 0.11 are no longer supported. They will now appear
  as regular files with a `.jjconflict` suffix and JSON contents.

* The minimum supported Rust version (MSRV) is now 1.88.

### Deprecations

* Various flags on `jj describe` and `jj commit` have been deprecated in favor
  of `jj metaedit`. They are:
  * `describe`: `--author`, `--reset-author`, `--no-edit`
  * `commit`:   `--author`, `--reset-author`

* The storage format of remote bookmarks and tags has changed. Remote bookmarks
  will be written in both old and new formats to retain forward compatibility.
  Git-tracking tags are also recorded for future native tagging support. This
  change should be transparent, but let us know if you see anything odd.

### New features

* The new command `jj bisect run` uses binary search to find a commit that
  introduced a bug.

* The default editor on Unix is now `nano` instead of `pico`.

* New config option `merge.hunk-level = "word"` to enable word-level merging.

* New config option `merge.same-change = "keep"` to disable lossy resolution
  rule for same-change conflicts.
  [#6369](https://github.com/jj-vcs/jj/issues/6369)

* Templates now support a `replace()` method on strings for pattern-based
  string replacement with optional limits. Supports all string patterns, including
  regex with capture groups (e.g. `"hello world".replace(regex:'(\w+) (\w+)', "$2 $1")`).

* A new builtin `hyperlink(url, text)` template alias creates clickable
  hyperlinks using [OSC8 escape sequences](https://github.com/Alhadis/OSC8-Adoption)
  for terminals that support them.

* Added a new conditional configuration `--when.platforms` to include
  settings only on certain platforms.

* External diff commands now support substitution variable `$width` for the
  number of available terminal columns.

* The new `jj gerrit upload` command allows you to upload given revisions to an
  instance of Gerrit Code Review.

* `jj bookmark create/set/move` use the working copy as a default again and
  no longer require an explicit revision argument. This walks back a
  deprecation from `jj 0.26`, as the community feedback was mostly negative.
  Instead, bookmarking an empty revision now produces a warning, to help you
  catch the case where you meant to bookmark the parent revision.

* The revset function `exactly(x, n)` will now evaluate `x` and error if it does
  not have exactly `n` elements.

* `jj util exec` now matches the exit status of the program it runs, and
  doesn't print anything.

* `jj config get` now supports displaying array and table config values.

* `jj util exec` sets the environment variable `JJ_WORKSPACE_ROOT`

### Fixed bugs

* Fetching repositories that have submodules no longer errors even if
  `submodule.recurse=true` is set in `.gitconfig` (but jj still isn't able to
  fetch the submodules or to operate on them).

### Contributors

Thanks to the people who made this release happen!

* Angel Ezquerra (@AngelEzquerra)
* Anton Älgmyr (@algmyr)
* Antonin Delpeuch (@wetneb)
* Austin Seipp (@thoughtpolice)
* Benjamin Tan (@bnjmnt4n)
* Conner Petzold (@ConnerPetzold)
* Daniel Luz (@mernen)
* Daniele Sassoli (@DanieleSassoli)
* David Barsky (@davidbarsky)
* Dinu Blanovschi (@dnbln)
* Gaëtan Lehmann (@glehmann)
* George Christou (@gechr)
* Ian Wrzesinski (@isuffix)
* Ilya Grigoriev (@ilyagr)
* Isaac Corbrey (@icorbrey)
* Ivan Petkov (@ipetkov)
* Jonas Fierlings (@PigeonF)
* loudgolem (@phanirithvij)
* Martin von Zweigbergk (@martinvonz)
* Matt Stark (@matts1)
* Matt T. Proud (@matttproud)
* Michael Pratt (@prattmic)
* MochikoNyan (@MochikoNyan)
* Philip Metzger (@PhilipMetzger)
* Reilly Brogan (@ReillyBrogan)
* Remo Senekowitsch (@senekor)
* Reuven Lazarus (@rlazarus)
* Scott Taylor (@scott2000)
* Stephen Jennings (@jennings)
* Steven Sherry (@Steven0351)
* Theo Buehler (@botovq)
* Yuya Nishihara (@yuja)