Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
Breaking changes
-
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
-
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. -
Workspaces may have an additional layered configuration, located at
.jj/workspace-config.toml.jj configsubcommands which took layer options like--reponow also support--workspace. -
Add support for
--when.workspacesconfig scopes. -
jj bisect runaccepts the command and arguments to pass to the command directly as positional arguments, such asjj bisect --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.
-
jj bookmark trackcan now associate new local bookmarks with remote. Tracked bookmarks can be pushed without--allow-new. #7072 -
New
jj tag set/deletecommands to create/update/delete tags locally. Updated tags will be exported to Git as lightweight tags. -
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. -
The new
jj git colocationcommand provides sub-commands to show the colocation state (status) and to convert a non-colocated git repo into a colocated repo (enable) and vice-versadisable.
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.
[0.34.0] - 2025-10-01
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 = falseto keep the previous behavior. -
Conflicts written by jj < 0.11 are no longer supported. They will now appear as regular files with a
.jjconflictsuffix and JSON contents. -
The minimum supported Rust version (MSRV) is now 1.88.
Deprecations
-
Various flags on
jj describeandjj commithave been deprecated in favor ofjj metaedit. They are:describe:--author,--reset-author,--no-editcommit:--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 runuses binary search to find a commit that introduced a bug. -
The default editor on Unix is now
nanoinstead ofpico. -
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 -
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 for terminals that support them. -
Added a new conditional configuration
--when.platformsto include settings only on certain platforms. -
External diff commands now support substitution variable
$widthfor the number of available terminal columns. -
The new
jj gerrit uploadcommand allows you to upload given revisions to an instance of Gerrit Code Review. -
jj bookmark create/set/moveuse the working copy as a default again and no longer require an explicit revision argument. This walks back a deprecation fromjj 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 evaluatexand error if it does not have exactlynelements. -
jj util execnow matches the exit status of the program it runs, and doesn't print anything. -
jj config getnow supports displaying array and table config values. -
jj util execsets the environment variableJJ_WORKSPACE_ROOT
Fixed bugs
- Fetching repositories that have submodules no longer errors even if
submodule.recurse=trueis 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)
[0.33.0] - 2025-09-03
Release highlights
-
jj undois now sequential: invoking it multiple times in sequence repeatedly undoes actions in the operation log. Previously,jj undowould only undo the most recent operation in the operation log. As a result, a newjj redocommand has been added. -
Experimental support for improving query performance over filesets and file queries (like
jj log path/to/file.txt) has been added. This is not enabled by default. To enable this, you must use thejj debug index-changed-pathscommand.
Breaking changes
-
jj evologtemplates now acceptCommitEvolutionEntryas context type. To getCommitproperties, usecommit.<method>(). To customize the default output, settemplates.evologinstead oftemplates.log. -
jj op shownow usestemplates.op_showconfiguration for its default template instead oftemplates.op_log. -
The deprecated config option
git.auto-local-branchhas been removed. Usegit.auto-local-bookmarkinstead. -
The deprecated
Signature.username()template method has been removed. UseSignature.email().local()instead. -
The deprecated
--config-tomlflag has been removed. Use--config=NAME=VALUEor--config-file=PATHinstead. -
jj undocan now undo multiple operations progressively by calling it repeatedly, whereas previously, runningjj undotwice was previously a no-op (it only undid the last change). -
jj git fetchwill now only fetch the refspec patterns configured on remotes when the--bookmarkoption is omitted. Only simple refspec patterns are currently supported, and anything else (like refspecs which rename branches) will be ignored. -
The
conflictlabel used for coloring log graph nodes was renamed toconflicted.
Deprecations
-
The on-disk index format has changed.
jjwill write index files in both old and new formats, so oldjjversions should be able to read these index files. This compatibility layer will be removed in a future release. -
jj op undois deprecated in favor ofjj op revert. (jj undois still available, but with new semantics. See also the breaking changes above.) -
The argument
<operation>ofjj undois deprecated in favor ofjj op revert <operation>. -
The
--whatflag onjj undois deprecated. Consider usingjj op restore --whatinstead.
New features
-
The new command
jj redocan progressively redo operations that were previously undone by multiple calls tojj undo. -
Templates now support
any()andall()methods on lists to check whether any or all elements satisfy a predicate. Example:parents.any(|c| c.mine())returns true if any parent commit is authored by the user. -
Add experimental support for indexing changed paths, which will speed up
jj log PATHquery,jj file annotate, etc. The changed-path index can be enabled byjj debug index-changed-pathscommand. Indexing may take tens of minutes depending on the number of merge commits. The indexing command UI is subject to change. #4674 -
jj config listnow supports-T'json(self) ++ "\n"'serialization output. -
jj file shownow accepts-T/--templateoption to insert file metadata. -
The template language now allows arbitrary whitespace between any operators.
-
The new configuration option
git.colocate=booleancontrols whether or not Git repositories are colocated by default. -
Both
jj git cloneandjj git initnow take a--no-colocateflag to disable colocation (in casegit.colocateis set totrue.) -
jj git remote addandjj git clonenow support--fetch-tagsto control when tags are fetched for all subsequent fetches. -
jj git fetchnow supports--trackedto fetch only tracked bookmarks. -
jj diff --statnow shows the change in size to binary files. -
jj interdiff,jj evolog -p, andjj op log -pnow show diff of commit descriptions. -
jj logandjj op logoutput can now be anonymized with thebuiltin_log_redactedandbuiltin_op_log_redactedtemplates. -
jj git initnow checks for anupstreamremote in addition tooriginwhen setting the repository-leveltrunk()alias. Theupstreamremote takes precedence overoriginif both exist. -
Add the
jj metaeditcommand, which modifies a revision's metadata. This can be used to generate a new change-id, which may help resolve some divergences. It also has options to modify author name, email and timestamp, as well as to modify committer timestamp. -
Filesets now support case-insensitive glob patterns with the
glob-i:,cwd-glob-i:, androot-glob-i:pattern kinds. For example,glob-i:"*.rs"will match bothfile.rsandFILE.RS. -
jj op shownow accepts-T/--templateoption to customize the operation output using template expressions, similar tojj op log. Also added--no-op-diffflag to suppress the operation diff. -
A nearly identical string pattern system as revsets is now supported in the template language, and is exposed as
string.match(pattern). -
Merge tools can use the
$pathargument to learn where the file they are merging will end up in the repository.
Fixed bugs
-
jj git clonenow correctly fetches all tags, unless--fetch-tagsis explicitly specified, in which case the specified option will apply for both the initial clone and subsequent fetches. -
Operation and working-copy state files are now synchronized to disk on save. This will mitigate data corruption on system crash. #4423
Packaging changes
- The test suite no longer optionally uses Taplo CLI or jq, and packagers can remove them as dependencies if present.
Contributors
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Christian Hufnagel (@OvidiusCicero)
- Clément (@drawbu)
- Daniel Luz (@mernen)
- Emily (@emilazy)
- Evan Martin (@evmar)
- Gaëtan Lehmann (@glehmann)
- George Christou (@gechr)
- Graham Christensen (@grahamc)
- Hegui Dai (@Natural-selection1)
- Ian Wrzesinski (@isuffix)
- Ilya Grigoriev (@ilyagr)
- Isaac Corbrey (@icorbrey)
- Ivan Petkov (@ipetkov)
- Joaquín Triñanes (@JoaquinTrinanes)
- Kaiyi Li (@06393993)
- Martin von Zweigbergk (@martinvonz)
- Nigthknight (@nigthknight)
- Nikhil Marathe (@nikhilm)
- Remo Senekowitsch (@senekor)
- Tijs-B (@Tijs-B)
- Yuya Nishihara (@yuja)
[0.32.0] - 2025-08-06
Breaking changes
-
In revsets, symbol expressions (such as change ID prefix) no longer resolve to multiple revisions, and error out if resolved to more than one revisions. Use
change_id(prefix)orbookmarks(exact:name)to query divergent changes or conflicted bookmarks. Commands likejj rebaseno longer requireall:to specify multiple destination revisions. -
jj op abandonnow discards previous versions of a change (or predecessors) if they become unreachable from the operation history. The evolution history is truncated accordingly.Once
jj op abandonandjj util gcare run in a repository, old versions ofjjmight get "commit not found" error onjj evolog. -
commit.working_copies()template method now returnsList<WorkspaceRef> -
The previously predefined
amendalias has been removed. You can restore it by setting the configaliases.amend = ["squash"].
Deprecations
-
The
all:revset modifier andui.always-allow-large-revsetssetting is planned to be removed in a future release. #6016 -
Rename the
core.fsmonitorandcore.watchmansettings tofsmonitor.backend, andfsmonitor.watchmanrespectively.
New features
-
jj workspace listnow accepts-T/--templateoption to customize its output via templates. -
Added
templates.workspace_listtemplate to customize the output ofjj workspace list. -
jj fixnow buffers the standard error stream from subprocesses and emits the output from each all at once. The file name is printed before the output. -
jj statusnow collapses fully untracked directories into one line. It still fully traverses them while snapshotting but they won't clutter up the output with all of their contents. -
Add the
working-copy.eol-conversionconfig which is similar to the gitcore.autocrlfconfig. A heuristics is used to detect if a file is a binary file to prevent the EOL conversion from changing binary files unexpectedly. -
Add a
.parents()method to theOperationtype in the templating language. -
Merge tools config can now explicitly forbid using them as diff editors or diff formatters. Built-in tools that do not function well as diff editing tools or as diff formatters will now report an error when used as such.
-
jj diffeditnow accepts filesets to edit only the specified paths. -
AnnotationLine objects in templates now have a
original_line_number() -> Integermethod. -
Commit templates now support
.files()to list all existing files at that revision. -
Glob patterns now support
{foo,bar}syntax. There may be subtle behavior changes as we use the globset library now. -
The new
bisect(x)revset function can help bisect a range of commits to find when a bug was introduced. -
New
first_parent()andfirst_ancestors()revset functions which are similar toparents()andancestors(), but only traverse the first parent of each commit (similar to Git's--first-parentoption). -
New
signing.backends.ssh.revocation-listconfig for specifying a list of revoked public keys for commit signature verification. -
jj fixcommands now replace$rootwith the workspace's root path. This is useful for tools stored inside the workspace.
Fixed bugs
-
Fixed an error in
jj util gccaused by the empty blob being missing from the Git store. #7062 -
jj op diff -pandjj op log -pnow show content diffs from the first predecessor only. #7090 -
jj git fetchno longer showsNaN%progress when connecting to slow remotes. #7155
Contributors
Thanks to the people who made this release happen!
- adamnemecek (@adamnemecek)
- Alexander Kobjolke (@jakalx)
- Apromixately (@Apromixately)
- Austin Seipp (@thoughtpolice)
- Bryce Berger (@bryceberger)
- Daniel Danner (@dnnr)
- Daniel Luz (@mernen)
- Evan Martin (@evmar)
- George Christou (@gechr)
- George Elliott-Hunter (@george-palmsens)
- Hubert Głuchowski (@afishhh)
- Ilya Grigoriev (@ilyagr)
- Jade Lovelace (@lf-)
- Jake Martin (@jake-m-commits)
- Jan Klass (@Kissaki)
- Joaquín Triñanes (@JoaquinTrinanes)
- Josh Steadmon (@steadmon)
- Kaiyi Li (@06393993)
- Martin von Zweigbergk (@martinvonz)
Lines 1–500 of 4155. Load more
# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] ### Breaking changes * 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 * 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. * 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`. * Add support for `--when.workspaces` config scopes. * `jj bisect run` accepts the command and arguments to pass to the command directly as positional arguments, such as `jj bisect --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. * `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) * New `jj tag set`/`delete` commands to create/update/delete tags locally. Updated tags will be exported to Git as lightweight tags. * 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. * The new `jj git colocation` command provides sub-commands to show the colocation state (`status`) and to convert a non-colocated git repo into a colocated repo (`enable`) and vice-versa `disable`. ### 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. ## [0.34.0] - 2025-10-01 ### 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) ## [0.33.0] - 2025-09-03 ### Release highlights * `jj undo` is now *sequential*: invoking it multiple times in sequence repeatedly undoes actions in the operation log. Previously, `jj undo` would only undo *the most recent* operation in the operation log. As a result, a new `jj redo` command has been added. * Experimental support for improving query performance over filesets and file queries (like `jj log path/to/file.txt`) has been added. This is not enabled by default. To enable this, you must use the `jj debug index-changed-paths` command. ### Breaking changes * `jj evolog` templates now accept `CommitEvolutionEntry` as context type. To get `Commit` properties, use `commit.<method>()`. To customize the default output, set `templates.evolog` instead of `templates.log`. * `jj op show` now uses `templates.op_show` configuration for its default template instead of `templates.op_log`. * The deprecated config option `git.auto-local-branch` has been removed. Use `git.auto-local-bookmark` instead. * The deprecated `Signature.username()` template method has been removed. Use `Signature.email().local()` instead. * The deprecated `--config-toml` flag has been removed. Use `--config=NAME=VALUE` or `--config-file=PATH` instead. * `jj undo` can now undo multiple operations progressively by calling it repeatedly, whereas previously, running `jj undo` twice was previously a no-op (it only undid the last change). * `jj git fetch` will now only fetch the refspec patterns configured on remotes when the `--bookmark` option is omitted. Only simple refspec patterns are currently supported, and anything else (like refspecs which rename branches) will be ignored. * The `conflict` label used for coloring log graph nodes was renamed to `conflicted`. ### Deprecations * The on-disk index format has changed. `jj` will write index files in both old and new formats, so old `jj` versions should be able to read these index files. This compatibility layer will be removed in a future release. * `jj op undo` is deprecated in favor of `jj op revert`. (`jj undo` is still available, but with new semantics. See also the breaking changes above.) * The argument `<operation>` of `jj undo` is deprecated in favor of `jj op revert <operation>`. * The `--what` flag on `jj undo` is deprecated. Consider using `jj op restore --what` instead. ### New features * The new command `jj redo` can progressively redo operations that were previously undone by multiple calls to `jj undo`. * Templates now support `any()` and `all()` methods on lists to check whether any or all elements satisfy a predicate. Example: `parents.any(|c| c.mine())` returns true if any parent commit is authored by the user. * Add experimental support for indexing changed paths, which will speed up `jj log PATH` query, `jj file annotate`, etc. The changed-path index can be enabled by `jj debug index-changed-paths` command. Indexing may take tens of minutes depending on the number of merge commits. The indexing command UI is subject to change. [#4674](https://github.com/jj-vcs/jj/issues/4674) * `jj config list` now supports `-T'json(self) ++ "\n"'` serialization output. * `jj file show` now accepts `-T`/`--template` option to insert file metadata. * The template language now allows arbitrary whitespace between any operators. * The new configuration option `git.colocate=boolean` controls whether or not Git repositories are colocated by default. * Both `jj git clone` and `jj git init` now take a `--no-colocate` flag to disable colocation (in case `git.colocate` is set to `true`.) * `jj git remote add` and `jj git clone` now support `--fetch-tags` to control when tags are fetched for all subsequent fetches. * `jj git fetch` now supports `--tracked` to fetch only tracked bookmarks. * `jj diff --stat` now shows the change in size to binary files. * `jj interdiff`, `jj evolog -p`, and `jj op log -p` now show diff of commit descriptions. * `jj log` and `jj op log` output can now be anonymized with the `builtin_log_redacted` and `builtin_op_log_redacted` templates. * `jj git init` now checks for an `upstream` remote in addition to `origin` when setting the repository-level `trunk()` alias. The `upstream` remote takes precedence over `origin` if both exist. * Add the `jj metaedit` command, which modifies a revision's metadata. This can be used to generate a new change-id, which may help resolve some divergences. It also has options to modify author name, email and timestamp, as well as to modify committer timestamp. * Filesets now support case-insensitive glob patterns with the `glob-i:`, `cwd-glob-i:`, and `root-glob-i:` pattern kinds. For example, `glob-i:"*.rs"` will match both `file.rs` and `FILE.RS`. * `jj op show` now accepts `-T`/`--template` option to customize the operation output using template expressions, similar to `jj op log`. Also added `--no-op-diff` flag to suppress the operation diff. * A nearly identical string pattern system as revsets is now supported in the template language, and is exposed as `string.match(pattern)`. * Merge tools can use the `$path` argument to learn where the file they are merging will end up in the repository. ### Fixed bugs * `jj git clone` now correctly fetches all tags, unless `--fetch-tags` is explicitly specified, in which case the specified option will apply for both the initial clone and subsequent fetches. * Operation and working-copy state files are now synchronized to disk on save. This will mitigate data corruption on system crash. [#4423](https://github.com/jj-vcs/jj/issues/4423) ### Packaging changes * The test suite no longer optionally uses Taplo CLI or jq, and packagers can remove them as dependencies if present. ### Contributors * Austin Seipp (@thoughtpolice) * Benjamin Tan (@bnjmnt4n) * Christian Hufnagel (@OvidiusCicero) * Clément (@drawbu) * Daniel Luz (@mernen) * Emily (@emilazy) * Evan Martin (@evmar) * Gaëtan Lehmann (@glehmann) * George Christou (@gechr) * Graham Christensen (@grahamc) * Hegui Dai (@Natural-selection1) * Ian Wrzesinski (@isuffix) * Ilya Grigoriev (@ilyagr) * Isaac Corbrey (@icorbrey) * Ivan Petkov (@ipetkov) * Joaquín Triñanes (@JoaquinTrinanes) * Kaiyi Li (@06393993) * Martin von Zweigbergk (@martinvonz) * Nigthknight (@nigthknight) * Nikhil Marathe (@nikhilm) * Remo Senekowitsch (@senekor) * Tijs-B (@Tijs-B) * Yuya Nishihara (@yuja) ## [0.32.0] - 2025-08-06 ### Breaking changes * In revsets, symbol expressions (such as change ID prefix) no longer resolve to multiple revisions, and error out if resolved to more than one revisions. Use `change_id(prefix)` or `bookmarks(exact:name)` to query divergent changes or conflicted bookmarks. Commands like `jj rebase` no longer require `all:` to specify multiple destination revisions. * `jj op abandon` now discards previous versions of a change (or predecessors) if they become unreachable from the operation history. The evolution history is truncated accordingly. Once `jj op abandon` and `jj util gc` are run in a repository, old versions of `jj` might get "commit not found" error on `jj evolog`. * `commit.working_copies()` template method now returns `List<WorkspaceRef>` * The previously predefined `amend` alias has been removed. You can restore it by setting the config `aliases.amend = ["squash"]`. ### Deprecations * The `all:` revset modifier and `ui.always-allow-large-revsets` setting is planned to be removed in a future release. [#6016](https://github.com/jj-vcs/jj/issues/6016) * Rename the `core.fsmonitor` and `core.watchman` settings to `fsmonitor.backend`, and `fsmonitor.watchman` respectively. ### New features * `jj workspace list` now accepts `-T`/`--template` option to customize its output via templates. * Added `templates.workspace_list` template to customize the output of `jj workspace list`. * `jj fix` now buffers the standard error stream from subprocesses and emits the output from each all at once. The file name is printed before the output. * `jj status` now collapses fully untracked directories into one line. It still fully traverses them while snapshotting but they won't clutter up the output with all of their contents. * Add the `working-copy.eol-conversion` config which is similar to the git `core.autocrlf` config. A heuristics is used to detect if a file is a binary file to prevent the EOL conversion from changing binary files unexpectedly. * Add a `.parents()` method to the [`Operation`](docs/templates.md#operation-type) type in the templating language. * Merge tools config can now explicitly forbid using them as diff editors or diff formatters. Built-in tools that do not function well as diff editing tools or as diff formatters will now report an error when used as such. * `jj diffedit` now accepts filesets to edit only the specified paths. * AnnotationLine objects in templates now have a `original_line_number() -> Integer` method. * Commit templates now support `.files()` to list all existing files at that revision. * Glob patterns now support `{foo,bar}` syntax. There may be subtle behavior changes as we use the [globset](https://crates.io/crates/globset) library now. * The new `bisect(x)` revset function can help bisect a range of commits to find when a bug was introduced. * New `first_parent()` and `first_ancestors()` revset functions which are similar to `parents()` and `ancestors()`, but only traverse the first parent of each commit (similar to Git's `--first-parent` option). * New `signing.backends.ssh.revocation-list` config for specifying a list of revoked public keys for commit signature verification. * `jj fix` commands now replace `$root` with the workspace's root path. This is useful for tools stored inside the workspace. ### Fixed bugs * Fixed an error in `jj util gc` caused by the empty blob being missing from the Git store. [#7062](https://github.com/jj-vcs/jj/issues/7062) * `jj op diff -p` and `jj op log -p` now show content diffs from the first predecessor only. [#7090](https://github.com/jj-vcs/jj/issues/7090) * `jj git fetch` no longer shows `NaN%` progress when connecting to slow remotes. [#7155](https://github.com/jj-vcs/jj/issues/7155) ### Contributors Thanks to the people who made this release happen! * adamnemecek (@adamnemecek) * Alexander Kobjolke (@jakalx) * Apromixately (@Apromixately) * Austin Seipp (@thoughtpolice) * Bryce Berger (@bryceberger) * Daniel Danner (@dnnr) * Daniel Luz (@mernen) * Evan Martin (@evmar) * George Christou (@gechr) * George Elliott-Hunter (@george-palmsens) * Hubert Głuchowski (@afishhh) * Ilya Grigoriev (@ilyagr) * Jade Lovelace (@lf-) * Jake Martin (@jake-m-commits) * Jan Klass (@Kissaki) * Joaquín Triñanes (@JoaquinTrinanes) * Josh Steadmon (@steadmon) * Kaiyi Li (@06393993) * Martin von Zweigbergk (@martinvonz)