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)