# Jujutsu changelog > A Git-compatible version control system with a working-copy-as-commit model. - Vendor: jj-vcs - Category: Developer Tools - Official site: https://github.com/jj-vcs/jj - Tracked by: What's New (https://whatsnew.fyi/product/jujutsu) - Harvested from: GitHub (jj-vcs/jj) - Entries below: 10 (newest first) What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. ## Releases ### v0.44.0 - Date: 2026-08-06 - Version: v0.44.0 - Original notes: https://github.com/jj-vcs/jj/releases/tag/v0.44.0 - Permalink: https://whatsnew.fyi/product/jujutsu/releases/v0.44.0 - **added** — Support for fetching and pushing tags, now stabilized with tracked or untracked tag management like bookmarks - **added** — New merge_point() revset function to find the point where multiple branches merge - **added** — jj workspace list now shows workspace roots by default with customizable output - **added** — New try(expr, fallback...) template function to suppress runtime errors - **added** — jj run now processes revisions from oldest to newest by default with guaranteed start order - **added** — jj run gained --passthrough flag to connect subprocess stdout/stderr directly to terminal - **added** — jj run gained --ignore-changes flag to avoid editing revisions even if command modifies working copy - **added** — jj run gained --ignore-errors flag to continue running remaining revisions on nonzero exit code - **added** — jj file search now supports -n/--line-number to prefix matches with 1-based line numbers - **added** — jj git push gained --allow-conflicts flag to allow pushing commits containing conflicts - **added** — New jj tag track/untrack commands to associate local tags with remotes - **added** — Added builtin_log() revset alias for the built-in default jj log revset - **added** — Added config option diff.stat.max-bar-width to limit the ++-- bar width - **added** — jj absorb now supports --interactive/-i/--tool to interactively choose which hunks to absorb - **changed** — jj git fetch now fetches tags the same way it fetches bookmarks as @ with automatic tracking - **changed** — jj git clone --fetch-tags=all|none|included removed in favor of --tag=PATTERN - **changed** — jj git push --all now pushes all tags in addition to bookmarks - **changed** — WorkspaceRef.root() and RepoPath.absolute() template functions now return Option and FsPath respectively instead of String - **changed** — jj file search now prints every matched line prefixed by file path instead of only file paths - **changed** — Passing an argument more than once is no longer an error, with last occurrence winning - **fixed** — Recursive alias definitions are detected more precisely to allow repeated aliases and fallback to default commands - **fixed** — Git temporary files are now cleaned up more reliably in the presence of signals - **fixed** — Fixed Git HEAD mismatch after the working copy became immutable - **fixed** — jj now creates a new working-copy revision as soon as the current workspace becomes immutable and during snapshotting - **fixed** — Snapshotting no longer fails if working copy contains a path with non-UTF-8 name - **fixed** — Fixed failure when reading configuration in copied repo with empty repo-level configuration directory - **fixed** — jj diff and jj status no longer omit a rename or copy in merge commit when renamed source is present in multiple parents ###### 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.44.0/install-and-setup/) to get started. ###### Release highlights * Support for fetching and pushing tags has now been stabilized. Tags can be tracked or untracked just like bookmarks. Tracked tags are pushed by default. ###### Breaking changes * `jj git fetch` now fetches tags the same way it fetches bookmarks. Tags are fetched as `@`, and these remote tags are automatically tracked by local tags of the same name. Running `jj git fetch` in an existing repository will re-fetch all tags to initialize the tracking state. Git's `tagOpt` is no longer respected. To disable tag fetching, set `remotes..fetch-tags = '~*'` in the jj configuration. * `jj git clone --fetch-tags=all|none|included` is removed in favor of `--tag=PATTERN`. * `jj git push --all` now pushes all tags in addition to bookmarks. * The `WorkspaceRef.root()` and `RepoPath.absolute()` template functions now return `Option` and `FsPath` respectively, instead of `String`. The `path` keyword in `jj config list` templates now returns `Option`. * `jj file search` now prints every matched line prefixed by the file path, instead of only the file paths of files containing a match. Use `--name-only` for the previous behavior. [#9399](https://github.com/jj-vcs/jj/issues/9399) * Passing an argument more than once is no longer an error. The last occurrence wins, so `jj --no-pager --no-pager version` and `jj log -n 5 -n 10` now work, and an argument baked into an alias or a wrapper can be given explicitly as well. Arguments that can be specified multiple times, such as `--config` and `jj log -r`, are unaffected and still collect all of their values. [#8101](https://github.com/jj-vcs/jj/issues/8101) [#9859](https://github.com/jj-vcs/jj/issues/9859) ###### Deprecations None ###### New features * New `merge_point()` revset function which (similar to `fork_point`) finds the point where multiple branches merge. * `jj workspace list` now shows workspace roots by default. The output can be customized with `templates.workspace_list` or `-T`, and `WorkspaceRef.root()` returns an optional `FsPath` value. [#9713](https://github.com/jj-vcs/jj/pull/9713), [#9826](https://github.com/jj-vcs/jj/pull/9826) * New `try(expr, fallback...)` template function to suppress runtime errors. * `jj run` now processes revisions from oldest to newest by default. The start order is guaranteed: each revision begins execution only after the previous one has started, even with `--jobs` higher than 1. * `jj run` gained a `--passthrough` flag that connects the subprocess's stdout/stderr directly to the terminal instead of capturing output. * `jj run` gained a `--ignore-changes` flag to avoid editing any revisions even if the command modifies the working copy. * `jj run` gained a `--ignore-errors` flag to continue running against the remaining revisions even if the command exits with a nonzero exit code. * `jj file search` now supports `-n`/`--line-number` to prefix each match with its 1-based line number within the file. * `jj git push` gained a `--allow-conflicts` flag to allow pushing commits containing conflicts. * New `jj tag track`/`untrack` commands to associate local tags with remotes. Note that fetched tags are tracked by default. * Added `builtin_log()` revset alias for the built-in default `jj log` revset. `revsets.log` now defaults to `builtin_log()`, so custom log revsets can reuse the built-in default instead of copying its full expression. * Added config option `diff.stat.max-bar-width` for use with `--stat` to limit the `++--` bar width. In the templating language, `diff.stat()` can optionally take a second (positional or named _[Truncated at 4000 characters — full notes: https://github.com/jj-vcs/jj/releases/tag/v0.44.0]_ ### v0.43.0 - Date: 2026-07-02 - Version: v0.43.0 - Original notes: https://github.com/jj-vcs/jj/releases/tag/v0.43.0 - Permalink: https://whatsnew.fyi/product/jujutsu/releases/v0.43.0 - **added** — Add `jj run` command to run a command over a set of changes, each with their own private working copy, with commands updating the working copy and changes/conflicts propagated accordingly - **added** — Add `--reversed` flag to `jj show` command - **added** — Add support for looking for config files in `/etc/jj` - **added** — Add `jj config gc` to delete configuration of deleted or moved repos from `~/.config/jj/repos` folder - **added** — Add `-o` (`--option`) flag to `jj gerrit upload` command, working like `git push -o` (`--push-option`) - **added** — Add `forks()` revset function that yields all commits with more than 1 child - **added** — Add support for crossed-out text styling with `{ crossed-out = true }` in `colors` config - **changed** — `jj git fetch` now rebases the descendants of revisions that were rewritten based on their change IDs - **removed** — Remove deprecated `git_head()` and `git_refs()` functions from revsets and templates - **removed** — Remove Git-like symbol resolution (e.g. `refs/heads/main`) from revisions; use bookmark/tag `` or `@` syntax instead - **removed** — Remove deprecated `ui.revsets-use-glob-by-default` option - **removed** — Remove `:@` pattern support from `jj bookmark track`/`untrack` commands - **fixed** — Fix Windows behavior where querying a path's file identity no longer follows symbolic links, matching Unix behavior - **fixed** — Fix `jj` to create a new working-copy revision during snapshotting if the working copy was immutable - **fixed** — Add warning in `jj git remote add` if the new remote exactly matches an existing remote's fetch URL or effective push URL - **fixed** — Fix corrupt loose Git objects on Intel Raptor Lake CPU and aarch64 ###### 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.43.0/install-and-setup/) to get started. ###### Release highlights * `jj run` allows you to run a command over a set of changes, each with their own private working copy; the commands may update the working copy and changes/conflicts are propagated accordingly, e.g., `jj run -- cargo check --all-features` or `jj run -- cargo fix` behaves as one might expect. ###### Breaking changes * The deprecated `git_head()` and `git_refs()` functions have been removed from revsets and templates. * Git-like symbols (e.g. `refs/heads/main`) are no longer resolved to revisions. Use the bookmark/tag `` or `@` syntax instead. * The deprecated `ui.revsets-use-glob-by-default` option has been removed. * `jj bookmark track`/`untrack` no longer supports `:@` patterns. However, the `@` symbol syntax is still supported. [#9226](https://github.com/jj-vcs/jj/issues/9226) ###### Deprecations ###### New features * `jj show` now supports `--reversed` flag. * `jj` now looks for config files in `/etc/jj`. * `jj config gc` will delete configuration of deleted/moved repos from `~/.config/jj/repos` folder. [#9362](https://github.com/jj-vcs/jj/issues/9362) * `jj run` allows you to run a command over a set of changes, each with their own private working copy; the commands may update the working copy and changes/conflicts are propagated accordingly, e.g., `jj run -- cargo check --all-features` or `jj run -- cargo fix` behaves as one might expect. * `jj gerrit upload` now supports the `-o` (`--option`) flag, which works like `git push -o` (`--push-option`). * `jj git fetch` now rebases the descendants of revisions that were rewritten based on their change IDs. Previously, when multiple bookmarked revisions existed in a stack, those rewritten revisions and their descendants wouldn't always be rebased. Note that immutable descendants will not be rebased. * Add a `forks()` revset function that yields all commits with more than 1 child. * `colors` config now supports crossed-out text styling with `{ crossed-out = true }`. ###### Fixed bugs * On Windows, querying a path's file identity no longer follows symbolic links, matching the behavior on Unix. Previously a symlink shared the identity of its target, so two symlinks pointing at the same target were treated as the same file. This identity check is used when writing the working copy to detect aliases of the reserved `.git` and `.jj` directories. [#8924](https://github.com/jj-vcs/jj/issues/8924) * `jj` now creates a new working-copy revision during snapshotting if the working copy was immutable. Previously, the new revision was created immediately after the working copy became immutable. [#7751](https://github.com/jj-vcs/jj/issues/7751) [#9338](https://github.com/jj-vcs/jj/issues/9338) * `jj git remote add` now warns if the new remote exactly matches an existing remote's fetch URL or effective push URL. [#413](https://github.com/jj-vcs/jj/issues/413) * Fixed corrupt loose Git objects on Intel Raptor Lake CPU and aarch64. Previously, jj could report a successful commit even though `git fsck` would later fail with `incorrect data check`, `corrupt loose object`, or `missing blob`, and later jj operations could fail with `corrupt deflate stream`. ###### Contributors Thanks to the people who made this release happen! * adlerd (@adlerd) * ase (@adamse) * Atakan Yenel (@atakanyenel) * Austin Seipp (@thoughtpolice) * Benjamin Tan (@bnjmnt4n) * David Rieber (@drieber) * figsoda (@figsoda) * Gaëtan Lehmann (@glehmann) * hexbinoct (@hexbinoct) * Jakub Stasiak (@jstasiak) * Jonas Carpay (@jonascarpay) * Joseph Lou (@josephlou5) * J _[Truncated at 4000 characters — full notes: https://github.com/jj-vcs/jj/releases/tag/v0.43.0]_ ### v0.42.0 - Date: 2026-06-04 - Version: v0.42.0 - Original notes: https://github.com/jj-vcs/jj/releases/tag/v0.42.0 - Permalink: https://whatsnew.fyi/product/jujutsu/releases/v0.42.0 - **changed** — Switched to the mimalloc memory allocator for better multi-threaded performance - **removed** — Removed deprecated command options: jj commit --reset-author/--author, jj describe --no-edit/--edit/--reset-author/--author, jj git push --allow-new, and jj metaedit --update-committer-timestamp - **removed** — Removed deprecated config options: git.auto-local-bookmark and git.push-new-bookmarks - **deprecated** — jj evolog no longer supports legacy commit predecessors recorded in jj < 0.30 - **added** — Shell completions now surface descriptions for custom aliases, revset-aliases, template-aliases, and fileset-aliases extracted from the .doc field - **changed** — jj show now accepts multiple revisions, showing all of them one after the other, behaving closer to git show - **added** — jj git fetch now generates evolution history based on change IDs and rebases local descendant revisions onto rewritten parents when change IDs are preserved by the remote - **added** — Added jj util backend name command that prints the commit backend being used in the current repo - **added** — Added edit-invocation-mode config option for diff editors with file-by-file mode to launch the editor once per changed file - **fixed** — jj git remote add now reports an error instead of panicking when the remote name is empty or contains whitespace - **fixed** — Color-words diffs are now shown as separate before and after lines when color output is disabled - **fixed** — jj bookmark forget no longer prints Forgot N local bookmarks message when no local bookmarks were actually forgotten - **fixed** — The builtin_log_redacted template now also redacts workspace names ###### 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.42.0/install-and-setup/) to get started. ###### Release highlights * Switched to the mimalloc memory allocator for better multi-threaded performance. ###### Breaking changes * The following deprecated command options have been removed: - `jj commit --reset-author`/`--author` - `jj describe --no-edit`/`--edit`/`--reset-author`/`--author` - `jj git push --allow-new` - `jj metaedit --update-committer-timestamp` * The following deprecated config options have been removed: - `git.auto-local-bookmark` - `git.push-new-bookmarks` ###### Deprecations * `jj evolog` no longer supports legacy commit predecessors recorded in `jj` < 0.30. ###### New features * Shell completions now surface descriptions for custom aliases, revset-aliases, template-aliases, and fileset-aliases. Descriptions are extracted from the `.doc` field of the alias definition if it is a table with `.doc` and `.definition` properties. * `jj show` now accepts multiple revisions, showing all of them one after the other, behaving closer to `git show`. * `jj git fetch` now generates evolution history based on change IDs. If change IDs are preserved by the remote, local descendant revisions will be rebased onto the rewritten parents. * Added `jj util backend name` command that prints the commit backend being used in the current repo. * Added `edit-invocation-mode` config option for diff editors (e.g. `jj diffedit`, `jj split`). When set to `"file-by-file"`, the editor is launched once per changed file, making it possible to use per-file tools like `vimdiff` for editing. ###### Fixed bugs * `jj git remote add` now reports an error instead of panicking when the remote name is empty or contains whitespace. [#9099](https://github.com/jj-vcs/jj/issues/9099) * Color-words diffs are now shown as separate before and after lines when color output is disabled, making piped or redirected diffs readable. [#5894](https://github.com/jj-vcs/jj/issues/5894) * `jj bookmark forget` no longer prints `Forgot N local bookmarks.` when no local bookmarks were actually forgotten (e.g. when only an untracked remote bookmark matched). [#9181](https://github.com/jj-vcs/jj/issues/9181). * The `builtin_log_redacted` template now also redacts workspace names. ###### Contributors Thanks to the people who made this release happen! * Alex Jaspersen (@ajaspers) * Archer (@archer-321) * ase (@adamse) * Austin Seipp (@thoughtpolice) * David Rieber (@drieber) * Eyüp Can Akman (@eyupcanakman) * Jakub Stasiak (@jstasiak) * James Dixon (@lemonase) * Joseph Lou (@josephlou5) * Laurynas Keturakis (@laulauland) * Luna Schwalbe (@lunagl) * Martin von Zweigbergk (@martinvonz) * Niko Savola (@nikosavola) * OlshaMB (@OlshaMB) * Sergey Kasmy (@SergeyKasmy) * truffle (@truffle-dev) * Vincent Ging Ho Yim (@cenviity) * Yuya Nishihara (@yuja) ### v0.41.0 - Date: 2026-05-07 - Version: v0.41.0 - Original notes: https://github.com/jj-vcs/jj/releases/tag/v0.41.0 - Permalink: https://whatsnew.fyi/product/jujutsu/releases/v0.41.0 - **added** — jj fix now supports formatting specific line ranges via line-range-arg and run-tool-if-zero-line-ranges configs - **added** — New global flag --no-integrate-operation to run commands without impacting repo state or working copy - **added** — The --pattern flag for file search now accepts various pattern kinds through kind:pattern syntax - **added** — New config option diff.git.show-path-prefix to suppress a/ and b/ path prefixes in diff --git output - **added** — New replace(pattern, content, replacement) template function supporting pattern replacement with lambda formatting - **added** — New ByteString template type for things like file content - **added** — jj gerrit upload now supports --message, --edit, --merged options and multiple --hashtag repetitions - **added** — New remotes..fetch-bookmarks and fetch-tags options to configure default fetch targets - **added** — JJ_PAGER environment variable can now override ui.pager config - **changed** — The --pattern flag for file search now defaults to regex: instead of glob: - **changed** — jj git push --all/--tracked/-r REVSETS no longer fails when revisions are private or have conflicts - **changed** — Branch/bookmark patterns passed to jj git clone are now saved to jj repo settings file instead of .git/config - **deprecated** — In the templating language, Operation type's .tags() function has been deprecated in favor of .attributes() - **fixed** — Improved consistency with git handling of .gitignore including / after entries and \r\r\n for macOS files - **fixed** — jj status now filters untracked paths by fileset - **fixed** — Improved performance for snapshotting, visibly improving jj status speed for large repositories - **fixed** — Pre-existing Git submodule directories are no longer considered conflicts in checkouts - **fixed** — Fixed a panic in jj gerrit upload when run without -r and the inferred revision was immutable - **fixed** — jj status now respects path filters in working copy summaries - **fixed** — jj git remote rename/remove now updates the trunk() alias - **fixed** — Commands no longer incorrectly diagnose a stale working copy and suggest running jj op integrate when it would have no effect ###### 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.41.0/install-and-setup/) to get started. ###### Release highlights * `jj fix` now supports formatting specific line ranges (allowing you to format only modified lines); see the configuration manual and notes below for more. * The new global flag `--no-integrate-operation` will let you run a command without impacting the repo state or the working copy, which is useful when automated tools may create snapshots in the background. ###### Breaking changes * The `--pattern` flag for `file search` now defaults to `regex:` instead of `glob:`. * `jj git push --all`/`--tracked`/`-r REVSETS` no longer fails when revisions to push are private or have conflicts. Bookmarks which aren't eligible to push will be skipped. * Branch/bookmark patterns passed to `jj git clone` are now saved to jj's repo settings file instead of `.git/config`. Git fetch refspecs are set to the default value. ###### Deprecations * In the templating language, the `Operation` type's `.tags()` function has been deprecated in favor of `.attributes()`. ###### New features * The `--pattern` flag for `file search` now accepts various pattern kinds through `kind:pattern` syntax. * A new global flag `--no-integrate-operation` lets you run a command without impacting the repo state or the working copy. * A new config option `diff.git.show-path-prefix` can be used to suppress the `a/` and `b/` path prefixes in the `diff --git` output. * `jj fix` now supports line range-limited formatting via the `fix.tools..line-range-arg` and `run-tool-if-zero-line-ranges` configs. This allows running tools only on modified lines and fine-grained control over when the tool is run. If you have set the `line-range-arg` config, use `--all-lines` to match the previous behavior of formatting the entire file. * A new `replace(pattern, content, replacement)` template function is added which supports replacement of content in templates, using a lambda to format replacement text. It supports all string patterns, including regexes with capture groups (e.g. `replace(regex:'(\w+) (\w+)', "hello world", |c| c.get(1) ++ " " ++ c.get(2))`). * New `ByteString` template type for things like file content. * `jj gerrit upload` now supports the new options `--message` (`-m`), `--edit` and `--merged`. You can now also pass multiple hashtags by repeating the `--hashtag` option. * New `remotes..fetch-bookmarks`/`fetch-tags` options to [configure default fetch targets.](docs/config.md#default-bookmarks-and-tags-to-fetch) * `JJ_PAGER` can now override the `ui.pager` config, matching `JJ_EDITOR` for callers that need a jj-specific environment override. ###### Fixed bugs * Improving consistency with `git` handling of `.gitignore`, including `/` after entries and `\r\r\n` for MacOS files. * `jj status` filters untracked paths by fileset [#9287](https://github.com/jj-vcs/jj/issues/9287) * Improved performance for snapshotting, visibly improving `jj status` speed for large repositories. * Pre-existing Git submodule directories are no longer considered conflicts in checkouts. [#8065](https://github.com/jj-vcs/jj/issues/8065). * Fixed a panic in `jj gerrit upload` when run without `-r` and the inferred revision was immutable. [#9398](https://github.com/jj-vcs/jj/issues/9398) * `jj status` respects path filters in working copy summaries. * `jj git remote rename`/`remove` now updates the `trunk()` alias. * Commands would sometimes incorrectly diagnose a stale working copy and suggest running `jj op integrate` when it would have no effect. This should now be much less likely to happen in practice. [#9314](https://github.com/jj-vcs/jj/issues/9314) ###### Contributors Thanks to the _[Truncated at 4000 characters — full notes: https://github.com/jj-vcs/jj/releases/tag/v0.41.0]_ ### v0.40.0 - Date: 2026-04-02 - Version: v0.40.0 - Original notes: https://github.com/jj-vcs/jj/releases/tag/v0.40.0 - Permalink: https://whatsnew.fyi/product/jujutsu/releases/v0.40.0 - **added** — New `diff_lines_added()` and `diff_lines_removed()` revset functions for matching content on only one side of a diff - **added** — The `end` parameter in the `String.substr(start, end)` templating method is now optional, returning from `start` to the end of the string if not given - **added** — `WorkspaceRef` templates now provide a `.root()` method to show the absolute path to each workspace root - **added** — The `jj arrange` TUI now includes immediate parents and children, dimmed by default and not selectable - **changed** — `jj arrange` uses the default log template (`builtin_log_compact`) instead of the shorter commit summary style - **changed** — In the `jj arrange` TUI, the "swap up/down" actions now move along graph edges even if the commit rows are not adjacent - **added** — Diff colors can now be configured differently for each format - **added** — `jj op log` now includes the name of the workspace the operation was created from - **changed** — The `config()` template function now accepts a `Stringify` expression instead of `LiteralString` to allow looking up configuration values dynamically - **changed** — `jj op show`, `jj op diff`, `jj op log -p` now only show "interesting" revisions by default defined by `revsets.op-diff-changes-in`, with a new `--show-changes-in` flag to override this - **fixed** — `.gitignore` with UTF-8 BOM can now be parsed correctly - **fixed** — Fix incompatibility with gpgsm 2.5.x ###### 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.40.0/install-and-setup/) to get started. ###### Release highlights None ###### Breaking changes None ###### Deprecations None ###### New features * New `diff_lines_added()` and `diff_lines_removed()` revset functions for matching content on only one side of a diff. * The `end` parameter in the `String.substr(start, end)` templating method is now optional. If not given, `substr()` returns from `start` to the end of the string. * `WorkspaceRef` templates now provide a `.root()` method to show the absolute path to each workspace root. * The `jj arrange` TUI now includes immediate parents and children. They are not selectable and are dimmed by default. * `jj arrange` uses the default log template (`builtin_log_compact`) instead of the shorter commit summary style. * In the `jj arrange` TUI, the "swap up/down" actions now move along graph edges even if the commit rows are not adjacent. * [Diff colors](docs/config.md#diff-colors-and-styles) can now be configured differently for each format. * `jj op log` now includes the name of the workspace the operation was created from. * The `config()` template function now accepts a `Stringify` expression instead of `LiteralString`. This allows looking up configuration values dynamically. * `jj op show`, `jj op diff`, `jj op log -p` now only show "interesting" revisions by default (defined by `revsets.op-diff-changes-in`). A new flag, `--show-changes-in`, can be used to override this. [#6083](https://github.com/jj-vcs/jj/issues/6083) ###### Fixed bugs * `.gitignore` with UTF-8 BOM can now be parsed correctly. * Fix incompatibility with gpgsm 2.5.x. ###### Contributors Thanks to the people who made this release happen! * Aaron Sutton (@aaronjsutton) * Adam Sandberg Eriksson (@adamse) * Anton Älgmyr (@algmyr) * Austin Seipp (@thoughtpolice) * Benjamin Tan (@bnjmnt4n) * Ben Warren (@warrenbhw) * Bryant Chandler (@brychanrobot) * David Higgs (@higgsd) * Filip Weiss (@fiws) * Gabriel Goller (@kaffarell) * Gaëtan Lehmann (@glehmann) * Ilya Grigoriev (@ilyagr) * Jeff Turner (@jefft) * Joseph Lou (@josephlou5) * Josh Steadmon (@steadmon) * KITAGAWA Yasutaka (@kit494way) * Liam (@terror) * Li-Wen Hsu (@lwhsu) * Martin von Zweigbergk (@martinvonz) * Philip Metzger (@PhilipMetzger) * Poliorcetics (@poliorcetics) * Remo Senekowitsch (@senekor) * Rob Pilling (@bobrippling) * Scott Taylor (@scott2000) * Shnatu * Stephen Prater (@stephenprater) * Yuya Nishihara (@yuja) * Zeyi Fan (@fanzeyi) ### v0.39.0 - Date: 2026-03-04 - Version: v0.39.0 - Original notes: https://github.com/jj-vcs/jj/releases/tag/v0.39.0 - Permalink: https://whatsnew.fyi/product/jujutsu/releases/v0.39.0 - **added** — Add `jj arrange` command to reorder and abandon revisions in a TUI - **added** — Add `jj bookmark advance` command to automatically move bookmarks forward to a target revision - **added** — Add support for push options in `jj git push` with the `--option` flag and `-o` short alias - **added** — Add `new_description` template evaluation in `jj new` to populate initial commit description - **added** — Add `first()`, `last()`, `get(index)`, `reverse()`, `skip(count)`, and `take(count)` methods on list types in templates - **added** — Add `builtin_draft_commit_description_with_diff` template that includes diff in commit description editor - **added** — Add `name:x` pattern aliases in revsets and templates such as `grep:x` - **added** — Add user aliases support in filesets - **added** — Add `jj util snapshot` command to manually or programmatically trigger a snapshot - **added** — Add `Timestamp::since(ts)` template function to return TimestampRange between two timestamps - **added** — Add `--simplify-parents` flag to `jj rebase` to apply simplify-parents transformation - **added** — Add support for new flags in `jj gerrit upload` including `--reviewer` and `--label` - **added** — Add `--overwrite-existing` flag to `jj bookmark rename` to replace existing bookmarks - **added** — Add conditional configuration support based on environment variables with `--when.environments` - **changed** — Relative paths now used by `jj workspace add` to enable workspaces in containers or when moved together - **changed** — `jj undo` now outputs what operation was undone in addition to the operation restored to - **changed** — Bookmarks with two or more consecutive `-` characters no longer require quoting in revsets - **changed** — `jj rebase --branch` and `jj rebase --source` now print a message instead of returning an error for empty revision sets - **changed** — Changed Git representation of conflicted commits to include files from first side of conflict - **changed** — Background snapshotting now suppresses stdout and stderr to avoid long hangs - **changed** — `jj gerrit upload` no longer requires the `-r` flag and defaults to uploading current work - **removed** — Drop support for legacy index files written by jj < 0.33 - **removed** — Remove deprecated config options `core.fsmonitor` and `core.watchman.register-snapshot-trigger` - **removed** — Remove deprecated command `jj op undo` - **deprecated** — `jj debug snapshot` is deprecated in favor of `jj util snapshot` and will be removed in v0.45.0 - **fixed** — Windows: use native file locks (LockFileEx) instead of polling with file creation - **fixed** — `jj` now safely detaches HEAD of alternate Git worktrees if their checked-out branch is moved or deleted - **fixed** — `jj file track --include-ignored` now works when fsmonitor.backend is set to watchman ###### 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.39.0/install-and-setup/) to get started. ###### Release highlights * `jj arrange` command brings up a TUI where you can reorder and abandon revisions. [#1531](https://github.com/jj-vcs/jj/issues/1531) * `jj bookmark advance` automatically moves bookmarks forward to a target revision (defaults to `@`) using customization points `revsets.bookmark-advance-from` and `revsets.bookmark-advance-to`. It is heavily inspired by the longstanding community alias `jj tug`. ###### Breaking changes * Dropped support for legacy index files written by jj < 0.33. New index files will be created as needed. * The following deprecated config options have been removed: - `core.fsmonitor` - `core.watchman.register-snapshot-trigger` * The deprecated command `jj op undo` has been removed. Use `jj op revert` or `jj undo`/`redo` instead. ###### Deprecations * `jj debug snapshot` is deprecated in favor of `jj util snapshot`. Although this was an undocumented command in the first place, it will be removed after 6 months (v0.45.0) to give people time to migrate away. ###### New features * Add support for push options in `jj git push` with the `--option` flag. This allows users to pass options to the remote server when pushing commits. The short alias `-o` is also supported. * `jj new` now evaluates the `new_description` template to populate the initial commit description when no `-m` message is provided. * Templates now support `first()`, `last()`, `get(index)`, `reverse()`, `skip(count)`, and `take(count)` methods on list types for more flexible list manipulation. * New `builtin_draft_commit_description_with_diff` template that includes the diff in the commit description editor, making it easier to review changes while writing commit messages. * Revsets and templates now support `name:x` pattern aliases such as `'grep:x' = 'description(regex:x)'`. * Filesets now support [user aliases](docs/filesets.md#aliases). * `jj workspace add` now links with relative paths. This enables workspaces to work inside containers or when moved together. Existing workspaces with absolute paths will continue to work as before. * `jj undo` now also outputs what operation was undone, in addition to the operation restored to. * Bookmarks with two or more consecutive `-` characters no longer need to be quoted in revsets. For example, `jj diff -r '"foo--bar"'` can now be written as `jj diff -r foo--bar`. * New flag `--simplify-parents` on `jj rebase` to apply the same transformation as `jj simplify-parents` on the rebased commits. [#7711](https://github.com/jj-vcs/jj/issues/7711) * `jj rebase --branch` and `jj rebase --source` will no longer return an error if the given argument resolves to an empty revision set (`jj rebase --revisions` already behaved this way). Instead, a message will be printed to inform the user why nothing has changed. * Changed Git representation of conflicted commits to include files from the first side of the conflict. This should prevent unchanged files from being highlighted as "added" in editors when checking out a conflicted commit in a colocated workspace. * New template function `Timestamp::since(ts)` that returns the `TimestampRange` between two timestamps. It can be used in conjunction with `.duration()` in order to obtain a human-friendly duration between two `Timestamp`s. * Added new `jj util snapshot` command to manually or programmatically trigger a snapshot. This introduces an official alternative to the previously-undocumented `jj debug snapshot` command. The Watchman integration has also been updated to use this command instead. * Changed background snapshotting to suppress stdout and stderr to avoid lon _[Truncated at 4000 characters — full notes: https://github.com/jj-vcs/jj/releases/tag/v0.39.0]_ ### v0.38.0 - Date: 2026-02-05 - Version: v0.38.0 - Original notes: https://github.com/jj-vcs/jj/releases/tag/v0.38.0 - Permalink: https://whatsnew.fyi/product/jujutsu/releases/v0.38.0 - **changed** — Per-repo and per-workspace config is now stored outside the repo for security reasons, with automatic migration of legacy repos - **changed** — Minimum supported git command version is now 2.41.0 - **removed** — Deprecated ui.always-allow-large-revsets setting and all: revset modifier have been removed - **changed** — @ revset symbols can now be resolved to remote tags with tags prioritized ahead of bookmarks - **removed** — Legacy placeholder support for unset user.name or user.email has been removed - **changed** — If any side of a conflicted file is missing a terminating newline, the materialized file in the working copy will no longer be terminated by a newline - **deprecated** — The revset function diff_contains() has been renamed to diff_lines() - **changed** — jj git fetch now shows details of abandoned commits by default, matching jj abandon output format - **added** — jj workspace root now accepts an optional --name argument to show the root path of the specified workspace - **changed** — jj git push --bookmark will now automatically track the bookmark if it isn't tracked with any remote already - **added** — Add git_web_url([remote]) template function that converts a git remote URL to a web URL - **added** — New divergent() revset function for divergent changes - **changed** — String pattern values in revsets and templates can now be substituted by aliases - **added** — New config option remotes..auto-track-created-bookmarks that only applies to bookmarks created locally - **added** — jj tag list can now be filtered by revset - **changed** — Conflict markers will use LF or CRLF as the line ending according to the contents of the file - **added** — New experimental jj git fetch --tag flag to fetch tags in the same way as bookmarks - **added** — New remote_tags() revset function to query remote tags - **added** — New builtin hyperlink() template function that gracefully falls back to text when outputting to a non-terminal - **fixed** — jj git init --colocate now refuses to run inside a Git worktree with a helpful error message ###### 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.38.0/install-and-setup/) to get started. ###### Release highlights * Per-repo and per-workspace config is now stored outside the repo, for security reasons. This is not a breaking change because we automatically migrate legacy repos to this new format. `.jj/repo/config.toml` and `.jj/workspace-config.toml` should no longer be used. ###### Breaking changes * The minimum supported `git` command version is now 2.41.0. macOS users will need to either upgrade "Developer Tools" to 26 or install Git from e.g. Homebrew. * Deprecated `ui.always-allow-large-revsets` setting and `all:` revset modifier have been removed. * `@` revset symbols can also be resolved to remote tags. Tags are prioritized ahead of bookmarks. * Legacy placeholder support used for unset `user.name` or `user.email` has been removed. Commits containing these values will now be pushed with `jj git push` without producing an error. * If any side of a conflicted file is missing a terminating newline, then the materialized file in the working copy will no longer be terminated by a newline. ###### Deprecations * The revset function `diff_contains()` has been renamed to `diff_lines()`. ###### New features * `jj git fetch` now shows details of abandoned commits (change IDs and descriptions) by default, matching the `jj abandon` output format. [#3081](https://github.com/jj-vcs/jj/issues/3081) * `jj workspace root` now accepts an optional `--name` argument to show the root path of the specified workspace (defaults to the current one). When given a workspace that was created before this release, it errors out. * `jj git push --bookmark ` will now automatically track the bookmark if it isn't tracked with any remote already. * Add `git_web_url([remote])` template function that converts a git remote URL to a web URL, suitable for opening in a browser. Defaults to the "origin" remote. * New `divergent()` revset function for divergent changes. * String pattern values in revsets and templates can now be substituted by aliases. For example, `grep(x) = description(regex:x)` now works. * A new config option `remotes..auto-track-created-bookmarks` behaves similarly to `auto-track-bookmarks`, but it only applies to bookmarks created locally. Setting it to `"*"` is now the closest replacement for the deprecated `git.push-new-bookmarks` option. * `jj tag list` can now be filtered by revset. * Conflict markers will use LF or CRLF as the line ending according to the contents of the file. [#7376](https://github.com/jj-vcs/jj/issues/7376) * New *experimental* `jj git fetch --tag` flag to fetch tags in the same way as bookmarks. If specified, tags won't be fetched implicitly, and only tags matching the pattern will be fetched as `@` tags. The fetched remote tags will be tracked by the local tags of the same name. * New `remote_tags()` revset function to query remote tags. * New builtin `hyperlink()` template function that gracefully falls back to text when outputting to a non-terminal, instead of emitting raw OSC 8 escape codes. [#7592](https://github.com/jj-vcs/jj/issues/7592) ###### Fixed bugs * `jj git init --colocate` now refuses to run inside a Git worktree, providing a helpful error message with alternatives. [#8052](https://github.com/jj-vcs/jj/issues/8052) * `jj git push` now ensures that tracked remote bookmarks are updated even if there are no mappings in the Git fetch refspecs. [#5115](https://github.com/jj-vcs/jj/issues/5115) * `jj git fetch`/`push` now forwards most of `git` stderr outputs such as authentication requests. [#5760](https://github.com/jj-vcs/jj/issues/5760) * Conflicted bookmarks and _[Truncated at 4000 characters — full notes: https://github.com/jj-vcs/jj/releases/tag/v0.38.0]_ ### v0.37.0 - Date: 2026-01-08 - Version: v0.37.0 - Original notes: https://github.com/jj-vcs/jj/releases/tag/v0.37.0 - Permalink: https://whatsnew.fyi/product/jujutsu/releases/v0.37.0 - **added** — A new syntax for referring to hidden and divergent change IDs is available: `xyz/n` where `n` is a number, allowing actions like `jj restore --from xyz/1 --to xyz` - **changed** — String patterns in revsets, command arguments, and configuration are now parsed as globs by default, with `substring:` or `exact:` prefix available as needed - **changed** — `remotes..auto-track-bookmarks` is now parsed the same way as in revsets and can be combined with logical operators - **changed** — `jj bookmark track`/`untrack` now accepts `--remote` argument, with the `@` syntax deprecated in favor of ` --remote=` - **changed** — On Windows, symlinks that point to a path with `/` are no longer supported as this path is invalid on Windows - **changed** — The template alias `format_short_change_id_with_hidden_and_divergent_info(commit)` has been replaced by `format_short_change_id_with_change_offset(commit)` - **removed** — Removed deprecated config options: `git.push-bookmark-prefix`, `ui.default-description`, `ui.diff.format`, `ui.diff.tool` - **removed** — Removed the deprecated `commit_id.normal_hex()` template method - **changed** — Template expansion that does not produce a terminating newline will not be fixed up by `jj log`, `jj evolog`, or `jj op log` - **changed** — The `diff` conflict marker style can now use `\\\\\\\` markers to indicate the continuation of a conflict label from the previous line - **deprecated** — The `git_head()` and `git_refs()` functions will be removed from revsets and templates - **added** — Updated the executable bit representation in the local working copy to allow ignoring executable bit changes on Unix with `working-copy.exec-bit-change = "respect" | "ignore"` - **changed** — `jj workspace add` now works for empty destination directories - **added** — `jj git remote` family of commands now supports different fetch and push URLs - **added** — `[colors]` table now supports `dim = true` attribute - **added** — In color-words diffs, context line numbers are now rendered with decreased intensity - **added** — `jj util gc` now prunes unreachable files in `.jj/repo/store/extra` to save disk space - **added** — Early version of a `jj file search` command for searching for a pattern in files like `git grep` - **added** — Conflict labels now contain information about where the sides of a conflict came from - **added** — `--insert-before` now accepts a revset that resolves to an empty set when used with `--insert-after` ###### 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.37.0/install-and-setup/) to get started. ###### Release highlights * A new syntax for referring to hidden and divergent change IDs is available: `xyz/n` where `n` is a number. For instance, `xyz/0` refers to the latest version of `xyz`, while `xyz/1` refers to the previous version of `xyz`. This allows you to perform actions like `jj restore --from xyz/1 --to xyz` to restore `xyz` to its previous contents, if you made a mistake. For divergent changes, the numeric suffix will always be shown in the log, allowing you to disambiguate them in a similar manner. ###### Breaking changes * [String patterns](docs/revsets.md#string-patterns) in revsets, command arguments, and configuration are now parsed as globs by default. Use `substring:` or `exact:` prefix as needed. * `remotes..auto-track-bookmarks` is now parsed the same way they are in revsets and can be combined with logical operators. * `jj bookmark track`/`untrack` now accepts `--remote` argument. If omitted, all remote bookmarks matching the bookmark names will be tracked/untracked. The old `@` syntax is deprecated in favor of ` --remote=`. * On Windows, symlinks that point to a path with `/` won't be supported. This path is [invalid on Windows](https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions). * The template alias `format_short_change_id_with_hidden_and_divergent_info(commit)` has been replaced by `format_short_change_id_with_change_offset(commit)`. * The following deprecated config options have been removed: - `git.push-bookmark-prefix` - `ui.default-description` - `ui.diff.format` - `ui.diff.tool` * The deprecated `commit_id.normal_hex()` template method has been removed. * Template expansion that did not produce a terminating newline will not be fixed up to provide one by `jj log`, `jj evolog`, or `jj op log`. * The `diff` conflict marker style can now use `\\\\\\\` markers to indicate the continuation of a conflict label from the previous line. ###### Deprecations * The `git_head()` and `git_refs()` functions will be removed from revsets and templates. `git_head()` should point to the `first_parent(@)` revision in colocated repositories. `git_refs()` can be approximated as `remote_bookmarks(remote=glob:*) | tags()`. ###### New features * Updated the executable bit representation in the local working copy to allow ignoring executable bit changes on Unix. By default we try to detect the filesystem's behavior, but this can be overridden manually by setting `working-copy.exec-bit-change = "respect" | "ignore"`. * `jj workspace add` now also works for empty destination directories. * `jj git remote` family of commands now supports different fetch and push URLs. * `[colors]` table now supports `dim = true` attribute. * In color-words diffs, context line numbers are now rendered with decreased intensity. * Hidden and divergent commits can now be unambiguously selected using their change ID combined with a numeric suffix. For instance, if there are two commits with change ID `xyz`, then one can be referred to as `xyz/0` and the other can be referred to as `xyz/1`. These suffixes are shown in the log when necessary to make a change ID unambiguous. * `jj util gc` now prunes unreachable files in `.jj/repo/store/extra` to save disk space. * Early version of a `jj file search` command for searching for a pattern in files (like `git grep`). * Conflict labels now contain information about where the sides of a conflict came from (e.g. `nlqwxzwn 7dd24e73 "first line of description"`). * `--insert-before` now accepts a revset that resolves to an empty set when used wit _[Truncated at 4000 characters — full notes: https://github.com/jj-vcs/jj/releases/tag/v0.37.0]_ ### v0.36.0 - Date: 2025-12-04 - Version: v0.36.0 - Original notes: https://github.com/jj-vcs/jj/releases/tag/v0.36.0 - Permalink: https://whatsnew.fyi/product/jujutsu/releases/v0.36.0 - **fixed** — Fixed race condition that could cause divergent operations when running concurrent jj commands in colocated repositories - **changed** — jj now ignores $PAGER set in the environment and uses less -FRX on most platforms (:builtin on Windows) - **changed** — In filesets or path patterns, glob matching is enabled by default - **changed** — String pattern arguments in jj bookmark delete/forget/list/move, jj tag delete/list, and jj git clone/fetch/push are now parsed the same way they are in revsets and can be combined with logical operators - **changed** — Unmatched bookmark/tag names in jj bookmark delete/forget/move/track/untrack, jj tag delete, and jj git clone/push now print a warning instead of causing an error - **changed** — Upgraded scm-record from v0.8.0 to v0.9.0 - **changed** — Minimum supported Rust version (MSRV) is now 1.89 - **removed** — On macOS, the deprecated config directory ~/Library/Application Support/jj is not read anymore - **changed** — Sub-repos are no longer tracked; any directory containing .jj or .git is ignored - **deprecated** — The --destination/-d arguments for jj rebase, jj split, jj revert, etc. were renamed to --onto/-o - **deprecated** — jj describe --edit is deprecated in favor of --editor - **deprecated** — The config options git.auto-local-bookmark and git.push-new-bookmarks are deprecated in favor of remotes..auto-track-bookmarks - **deprecated** — The flag --allow-new on jj git push is deprecated - **added** — jj commit, jj describe, jj squash, and jj split now accept --editor to ensure an editor opens even if a description was provided via --message/-m - **added** — All jj commands show a warning when the provided fileset expression doesn't match any files - **added** — Added files() template function to DiffStats - **added** — Added join() template function - **added** — RepoPath template type now has an absolute() -> String method - **added** — Added format_path(path) template alias that controls how file paths are printed with jj file list ###### 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.36.0/install-and-setup/) to get started. ###### Release highlights * The documentation has moved from to . 301 redirects are being issued towards the new domain, so any existing links should not be broken. * Fixed race condition that could cause divergent operations when running concurrent `jj` commands in colocated repositories. It is now safe to continuously run e.g. `jj log` without `--ignore-working-copy` in one terminal while you're running other commands in another terminal. [#6830](https://github.com/jj-vcs/jj/issues/6830) * `jj` now ignores `$PAGER` set in the environment and uses `less -FRX` on most platforms (`:builtin` on Windows). See [the docs](docs/config.md#pager) for more information, and [#3502](https://github.com/jj-vcs/jj/issues/3502) for motivation. ###### Breaking changes * In [filesets or path patterns](docs/filesets.md#file-patterns), glob matching is enabled by default. You can use `cwd:"path"` to match literal paths. * In the following commands, [string pattern arguments](docs/revsets.md#string-patterns) are now parsed the same way they are in revsets and can be combined with logical operators: `jj bookmark delete`/`forget`/`list`/`move`, `jj tag delete`/`list`, `jj git clone`/`fetch`/`push` * In the following commands, unmatched bookmark/tag names is no longer an error. A warning will be printed instead: `jj bookmark delete`/`forget`/`move`/`track`/`untrack`, `jj tag delete`, `jj git clone`/`push` * The default string pattern syntax in revsets will be changed to `glob:` in a future release. You can opt in to the new default by setting `ui.revsets-use-glob-by-default=true`. * Upgraded `scm-record` from v0.8.0 to v0.9.0. See release notes at . * The minimum supported Rust version (MSRV) is now 1.89. * On macOS, the deprecated config directory `~/Library/Application Support/jj` is not read anymore. Use `$XDG_CONFIG_HOME/jj` instead (defaults to `~/.config/jj`). * Sub-repos are no longer tracked. Any directory containing `.jj` or `.git` is ignored. Note that Git submodules are unaffected by this. ###### Deprecations * The `--destination`/`-d` arguments for `jj rebase`, `jj split`, `jj revert`, etc. were renamed to `--onto`/`-o`. The reasoning is that `--onto`, `--insert-before`, and `--insert-after` are all destination arguments, so calling one of them `--destination` was confusing and unclear. The old names will be removed at some point in the future, but we realize that they are deep in muscle memory, so you can expect an unusually long deprecation period. * `jj describe --edit` is deprecated in favor of `--editor`. * The config options `git.auto-local-bookmark` and `git.push-new-bookmarks` are deprecated in favor of `remotes..auto-track-bookmarks`. For example: ```toml [remotes.origin] auto-track-bookmarks = "glob:*" ``` For more details, refer to [the docs](docs/config.md#automatic-tracking-of-bookmarks). * The flag `--allow-new` on `jj git push` is deprecated. In order to push new bookmarks, please track them with `jj bookmark track`. Alternatively, consider setting up an auto-tracking configuration to avoid the chore of tracking bookmarks manually. For example: ```toml [remotes.origin] auto-track-bookmarks = "glob:*" ``` For more details, refer to [the docs](docs/config.md#automatic-tracking-of-bookmarks). ###### New features * `jj commit`, `jj describe`, `jj squash`, and `jj split` now accept `--editor`, which ensures an editor will be opened with the commit description even if one was provided via `--message`/`-m`. _[Truncated at 4000 characters — full notes: https://github.com/jj-vcs/jj/releases/tag/v0.36.0]_ ### v0.35.0 - Date: 2025-11-06 - Version: v0.35.0 - Original notes: https://github.com/jj-vcs/jj/releases/tag/v0.35.0 - Permalink: https://whatsnew.fyi/product/jujutsu/releases/v0.35.0 - **added** — Workspaces can now have their own separate configuration via `.jj/workspace-config.toml` and `jj config` subcommands support `--workspace` layer option - **added** — Use `jj bookmark track` to associate local bookmarks with a specific remote before pushing without `--allow-new` - **added** — New `jj git colocation` command with `status`, `enable`, and `disable` subcommands to convert between colocated and non-colocated workspaces - **added** — New `jj tag set` and `jj tag delete` commands to create, update, and delete tags locally - **added** — Templates now support a `.split(separator, [limit])` method on strings - **added** — `-G` short form available for `--no-graph` in `jj log`, `jj evolog`, `jj op log`, `jj op show`, and `jj op diff` - **added** — `jj metaedit` now accepts `-m`/`--message` option to non-interactively update the change description - **added** — The `CryptographicSignature.key()` template method now works for SSH signatures and returns the public key fingerprint - **added** — Added `template-aliases.empty_commit_marker` configuration option - **added** — Add support for `--when.workspaces` and `--when.hostnames` config scopes - **added** — `jj bisect run` accepts command and arguments directly as positional arguments - **added** — New commit template keywords `local_tags` and `remote_tags` to show only local or remote tags - **added** — `jj git clone` now supports `--branch` option to specify branches to fetch during clone - **added** — Revsets now support logical operators in string patterns - **changed** — Divergent changes are no longer marked red in immutable revisions - **removed** — The deprecated flag `--summary` of `jj abandon` has been removed - **removed** — The deprecated command `jj backout` has been removed, use `jj revert` instead - **removed** — Removed deprecated config options `signing.sign-all`, `core.watchman.register_snapshot_trigger`, and `diff.format` - **deprecated** — `jj bisect run --command ` is deprecated in favor of `jj bisect run -- ` - **deprecated** — `jj metaedit --update-committer-timestamp` was renamed to `jj metaedit --force-rewrite` - **fixed** — `jj metaedit --author-timestamp` twice with the same value no longer edits the change twice - **fixed** — `jj squash` fixed improper revision rebase when both `--insert-after` and `--insert-before` were used - **fixed** — `jj undo` can now revert fetch and import operations involving tag updates - **fixed** — Fixed parsing of `files(expr)` revset expression including parentheses - **fixed** — Fixed `jj describe --stdin` to append a final newline character ###### 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 ` is deprecated in favor of `jj bisect run -- `. * `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 repositori _[Truncated at 4000 characters — full notes: https://github.com/jj-vcs/jj/releases/tag/v0.35.0]_