- Workspaces can now have their own separate configuration via `.jj/workspace-config.toml` and `jj config` subcommands support `--workspace` layer option
- Use `jj bookmark track` to associate local bookmarks with a specific remote before pushing without `--allow-new`
- New `jj git colocation` command with `status`, `enable`, and `disable` subcommands to convert between colocated and non-colocated workspaces
- New `jj tag set` and `jj tag delete` commands to create, update, and delete tags locally
- Templates now support a `.split(separator, [limit])` method on strings
- `-G` short form available for `--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 works for SSH signatures and returns the public key fingerprint
- Added `template-aliases.empty_commit_marker` configuration option
- Add support for `--when.workspaces` and `--when.hostnames` config scopes
- `jj bisect run` accepts command and arguments directly as positional arguments
- New commit template keywords `local_tags` and `remote_tags` to show only local or remote tags
- `jj git clone` now supports `--branch` option to specify branches to fetch during clone
- Revsets now support logical operators in string patterns
- Divergent changes are no longer marked red in immutable revisions
- `jj metaedit --author-timestamp` twice with the same value no longer edits the change twice
- `jj squash` fixed improper revision rebase when both `--insert-after` and `--insert-before` were used
- `jj undo` can now revert fetch and import operations involving tag updates
- Fixed parsing of `files(expr)` revset expression including parentheses
- Fixed `jj describe --stdin` to append a final newline character
- The deprecated flag `--summary` of `jj abandon` has been removed
- The deprecated command `jj backout` has been removed, use `jj revert` instead
- Removed deprecated config options `signing.sign-all`, `core.watchman.register_snapshot_trigger`, and `diff.format`
- `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`
About
jj is a Git-compatible version control system that is both simple and powerful. See the installation instructions to get started.
Release highlights
-
Workspaces can now have their own separate configuration. For instance, you can use
jj config set --workspaceto update a configuration option only in the current workspace. -
After creating a local bookmark, it is now possible to use
jj bookmark trackto 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 enableandjj git colocation disablecommands allow converting between colocated and non-colocated workspaces.
Breaking changes
-
The
remote_bookmarks(remote=pattern)revset now includes Git-tracking bookmarks if the specifiedpatternmatchesgit. The default isremote=~exact:"git"as before. -
The deprecated flag
--summaryofjj abandonhas been removed. -
The deprecated command
jj backouthas been removed, usejj revertinstead. -
The following deprecated config options have been removed:
signing.sign-allcore.watchman.register_snapshot_triggerdiff.format
Deprecations
-
jj bisect run --command <cmd>is deprecated in favor ofjj bisect run -- <cmd>. -
jj metaedit --update-committer-timestampwas renamed tojj metaedit --force-rewritesince 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 configsubcommands which took layer options like--reponow also support--workspace. -
jj bookmark trackcan now associate new local bookmarks with remote. Tracked bookmarks can be pushed without--allow-new. #7072 -
The new
jj git colocationcommand 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/deletecommands 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. -
Templates now support a
.split(separator, [limit])method on strings to split a string into a list of substrings. -
-Gis now available as a short form of--no-graphinjj log,jj evolog,jj op log,jj op showandjj op diff. -
jj metaeditnow accepts-m/--messageoption 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.workspacesconfig scopes. -
Add support for
--when.hostnamesconfig scopes. This allows configuration to be conditionally applied based on the hostname set inoperation.hostname. -
jj bisect runaccepts the command and arguments to pass to the command directly as positional arguments, such asjj 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_tagsto show only local/remote tags. These keywords may be useful in non-colocated Git repositories where local and exported@gittags can point to different revisions. -
jj git clonenow supports the--branchoption 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-timestamptwice with the same value no longer edits the change twice in some cases. -
jj squash: fixed improper revision rebase when both--insert-afterand--insert-beforewere used. -
jj undocan now revert "fetch"/"import" operation that involves tag updates. #6325 -
Fixed parsing of
files(expr)revset expression including parentheses. #7747 -
Fixed
jj describe --stdinto 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)