v0.35.0

jj-vcs/jjv0.35.0Nov 6, 2025by scott2000

AI Summary

Workspaces can now have their own separate configuration, bookmarks can be associated with specific remotes for pushing, and new commands allow converting between colocated and non-colocated workspaces.

Key Highlights

  • Workspaces can now have their own separate configuration
  • Bookmarks can be associated with a specific remote before pushing
  • New `jj git colocation` commands to enable/disable colocation

Breaking Changes

  • The deprecated flag `--summary` of `jj abandon` has been removed
  • The deprecated command `jj backout` has been removed
  • The deprecated config options `signing.sign-all`, `core.watchman.register_snapshot_trigger`, and `diff.format` have been removed

New Features

  • Workspaces may have an additional layered configuration at `.jj/workspace-config.toml`
  • New `jj tag set`/`delete` commands to create/update/delete tags locally
  • Templates now support a `.split(separator, [limit])` method on strings
  • `jj bisect run` accepts command and arguments directly as positional arguments
  • New commit template keywords `local`/`remote_tags` to show only local/remote tags

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

### Release highlights

* Workspaces can now have their own separate configuration. For instance, you
  can use `jj config set --workspace` to update a configuration option only in
  the current workspace.

* After creating a local bookmark, it is now possible to use `jj bookmark track`
  to associate the bookmark with a specific remote before pushing it. When
  pushing a tracked bookmark, it is not necessary to use `--allow-new`.

* The new `jj git colocation enable` and `jj git colocation disable` commands
  allow converting between colocated and non-colocated workspaces.

### Breaking changes

* The `remote_bookmarks(remote=pattern)` revset now includes Git-tracking
  bookmarks if the specified `pattern` matches `git`. The default is
  `remote=~exact:"git"` as before.

* The deprecated flag `--summary` of `jj abandon` has been removed.

* The deprecated command `jj backout` has been removed, use `jj revert` instead.

* The following deprecated config options have been removed:
  - `signing.sign-all`
  - `core.watchman.register_snapshot_trigger`
  - `diff.format`

### Deprecations

 * `jj bisect run --command <cmd>` is deprecated in favor of
   `jj bisect run -- <cmd>`.

 * `jj metaedit --update-committer-timestamp` was renamed to
   `jj metaedit --force-rewrite` since the old name (and help text)
   incorrectly suggested that the committer name and email would _not_
   be updated.

### New features

* Workspaces may have an additional layered configuration, located at
  `.jj/workspace-config.toml`. `jj config` subcommands which took layer options
  like `--repo` now also support `--workspace`.

* `jj bookmark track` can now associate new local bookmarks with remote.
  Tracked bookmarks can be pushed without `--allow-new`.
  [#7072](https://github.com/jj-vcs/jj/issues/7072)

* The new `jj git colocation` command provides sub-commands to show the
  colocation state (`status`), to convert a non-colocated workspace into
  a colocated workspace (`enable`), and vice-versa (`disable`).

* New `jj tag set`/`delete` commands to create/update/delete tags locally.
  Created/updated tags are currently always exported to Git as lightweight
  tags. If you would prefer them to be exported as annotated tags, please give
  us feedback on [#7908](https://github.com/jj-vcs/jj/issues/7908).

* Templates now support a `.split(separator, [limit])` method on strings to
  split a string into a list of substrings.

* `-G` is now available as a short form of `--no-graph` in `jj log`, `jj evolog`,
  `jj op log`, `jj op show` and `jj op diff`.

* `jj metaedit` now accepts `-m`/`--message` option to non-interactively update
  the change description.

* The `CryptographicSignature.key()` template method now also works for SSH
  signatures and returns the corresponding public key fingerprint.

* Added `template-aliases.empty_commit_marker`. Users can override this value in
  their config to change the "(empty)" label on empty commits.

* Add support for `--when.workspaces` config scopes.

* Add support for `--when.hostnames` config scopes. This allows configuration to
  be conditionally applied based on the hostname set in `operation.hostname`.

* `jj bisect run` accepts the command and arguments to pass to the command
  directly as positional arguments, such as
  `jj bisect run --range=..main -- cargo check --all-targets`.

* Divergent changes are no longer marked red in immutable revisions. Since the
  revision is immutable, the user shouldn't take any action, so the red color
  was unnecessarily alarming.

* New commit template keywords `local`/`remote_tags` to show only local/remote
  tags. These keywords may be useful in non-colocated Git repositories where
  local and exported `@git` tags can point to different revisions.

*  `jj git clone` now supports the `--branch` option to specify the branch(es)
  to fetch during clone. If present, the first matching branch is used as the
  working-copy parent.

* Revsets now support logical operators in string patterns.

### Fixed bugs

* `jj metaedit --author-timestamp` twice with the same value no longer
edits the change twice in some cases.

* `jj squash`: fixed improper revision rebase when both `--insert-after` and
  `--insert-before` were used.

* `jj undo` can now revert "fetch"/"import" operation that involves tag updates.
  [#6325](https://github.com/jj-vcs/jj/issues/6325)

* Fixed parsing of `files(expr)` revset expression including parentheses.
  [#7747](https://github.com/jj-vcs/jj/issues/7747)

* Fixed `jj describe --stdin` to append a final newline character.

### Contributors

Thanks to the people who made this release happen!

* Alpha Chen (@kejadlen)
* Angel Ezquerra (@AngelEzquerra)
* ase (@adamse)
* Austin Seipp (@thoughtpolice)
* Benjamin Brittain (@benbrittain)
* bipul (@bipulmgr)
* Brian Schroeder (@bts)
* Bryce Berger (@bryceberger)
* Cole Helbling (@cole-h)
* Daniel Luz (@mernen)
* David Higgs (@higgsd)
* Defelo (@Defelo)
* Fedor (@sheremetyev)
* Gabriel Goller (@kaffarell)
* Gaëtan Lehmann (@glehmann)
* George Christou (@gechr)
* Ilya Grigoriev (@ilyagr)
* Isaac Corbrey (@icorbrey)
* James Coman (@jamescoman)
* Joseph Lou (@josephlou5)
* Lander Brandt (@landaire)
* Martin von Zweigbergk (@martinvonz)
* Michael Chirico (@MichaelChirico)
* Owen Brooks (@owenbrooks)
* Peter Schilling (@schpet)
* Philip Metzger (@PhilipMetzger)
* Remo Senekowitsch (@senekor)
* Ross Smyth (@RossSmyth)
* Scott Taylor (@scott2000)
* Steve Fink (@hotsphink)
* Steve Klabnik (@steveklabnik)
* Theo Buehler (@botovq)
* Theodore Dubois (@tbodt)
* Theodore Keloglou (@sirodoht)
* Yuya Nishihara (@yuja)