v0.28.0
jj-vcs/jjv0.28.0Apr 3, 2025by arxanas
AI Summary
A major release introducing enhanced configuration management, support for PKCS#12 signing, and several breaking changes including the removal of deprecated commands and configuration options.
Key Highlights
- Configuration files can now be split more easily, and multiple user configs are supported.
- The `jj resolve` command now accepts built-in tools `:ours` and `:theirs`.
- New `jj revert` command added, replacing `jj backout` functionality.
- In colocated repos, newly-created files now appear in `git diff`.
Breaking Changes
- Minimum supported Rust version (MSRV) is now 1.84.0.
- The `git.push-branch-prefix` config has been removed in favor of `git.push-bookmark-prefix`.
- The `jj unsquash` command has been removed.
- The `jj untrack` subcommand has been removed.
- Deprecated revset functions (e.g., `branches()`, `file()`) have been removed.
New Features
- PKCS#12 certificate signing support via `gpgsm` backend.
- Automatic use of the author's email GPG key.
- Multiple user config support with precedence order.
- Support for the `JJ_CONFIG` environment variable with multiple paths.
- New `jj git root` command to print Git directory location.
Full Release Notes
> [!IMPORTANT]
> v0.28.0 was yanked from https://crates.io and superseded by [v0.28.1](https://github.com/jj-vcs/jj/releases/tag/v0.28.1).
### 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.28.0/install-and-setup/) to get started.
### Release highlights
* jj's configuration can now be split into multiple files more easily.
* `jj resolve` now accepts built-in tools `:ours` and `:theirs`.
* In colocated repos, newly-created files will now appear in `git diff`.
* A long-standing bug relating to empty files in the built-in diff editor was
fixed. [#3702](https://github.com/jj-vcs/jj/issues/3702)
### Breaking changes
* The minimum supported Rust version (MSRV) is now 1.84.0.
* The `git.push-branch-prefix` config has been removed in favor of
`git.push-bookmark-prefix`.
* `jj abandon` no longer supports `--summary` to suppress the list of abandoned
commits. The list won't show more than 10 commits to not clutter the console.
* `jj unsquash` has been removed in favor of `jj squash` and
`jj diffedit --restore-descendants`.
* The `jj untrack` subcommand has been removed in favor of `jj file untrack`.
* The following deprecated revset functions have been removed:
- `branches()`, `remote_branches()`, `tracked_remote_branches()`, and
`untracked_remote_branches()`, which were renamed to "bookmarks".
- `file()` and `conflict()`, which were renamed to plural forms.
- `files(x, y, ..)` with multiple patterns. Use `files(x|y|..)` instead.
* The following deprecated template functions have been removed:
- `branches()`, `local_branches()`, and `remote_branches()`, which were
renamed to "bookmarks".
* The flags `--all` and `--tracked` on `jj git push` by themself do not cause
deleted bookmarks to be pushed anymore, as an additional safety measure. They
can now be combined with `--deleted` instead.
### Deprecations
* `core.watchman.register_snapshot_trigger` has been renamed to `core.watchman.register-snapshot-trigger` for consistency with other configuration options.
* `jj backout` is deprecated in favor of `jj revert`.
### New features
* `jj sign` can now sign with PKCS#12 certificates through the `gpgsm` backend.
* `jj sign` will automatically use the gpg key associated with the author's email
in the absence of a `signing.key` configuration.
* Multiple user configs are now supported and are loaded in the following precedence order:
- `$HOME/.jjconfig.toml`
- `$XDG_CONFIG_HOME/jj/config.toml`
- `$XDG_CONFIG_HOME/jj/conf.d/*.toml`
* The `JJ_CONFIG` environment variable can now contain multiple paths separated
by a colon (or semicolon on Windows).
* The command `jj config list` now supports showing the origin of each variable
via the `builtin_config_list_detailed` template.
* `jj config {edit,set,unset}` now prompt when multiple config files are found.
* `jj diff -r` now allows multiple revisions (as long as there are no gaps in
the revset), such as `jj diff -r 'mutable()'`.
* `jj git push` now accepts a `--named NAME=REVISION` argument to create a named
bookmark and immediately push it.
* The 'how to resolve conflicts' hint that is shown when conflicts appear can
be hidden by setting `hints.resolving-conflicts = false`.
* `jj op diff` and `jj op log --op-diff` now show changes to which commits
correspond to working copies.
* `jj op log -d` is now an alias for `jj op log --op-diff`.
* `jj bookmark move --to/--from` can now be abbreviated to `jj bookmark move -t/-f`
* `jj bookmark list` now supports `--sort` option. Similar to `git branch --sort`.
See `jj bookmark list --help` for more details.
* A new command `jj revert` is added, which is similar to `jj backout` but
adds the `--destination`, `--insert-after`, and `--insert-before` options to
customize the location of reverted commits.
* A new command `jj git root` is added, which prints the location of the Git
directory of a repository using the Git backend.
* In colocated repos, any files that jj considers added in the working copy will
now show up in `git diff` (as if you had run `git add --intent-to-add` on
them).
* Reversing colors is now supported. For example, to highlight words by
reversing colors rather than underlining, you can set
`colors."diff token"={ underline = false, reverse = true }` in your config.
* Added `revsets.log-graph-prioritize`, which can be used to configure
which branch in the `jj log` graph is displayed on the left instead of `@`
(e.g. `coalesce(description("megamerge\n"), trunk())`)
* `jj resolve` now accepts new built-in merge tools `:ours` and `:theirs`.
These merge tools accept side #1 and side #2 of the conflict respectively.
### Fixed bugs
* `jj log -p --stat` now shows diff stats as well as the default color-words/git
diff output. [#5986](https://github.com/jj-vcs/jj/issues/5986)
* The built-in diff editor now correctly handles deleted files.
[#3702](https://github.com/jj-vcs/jj/issues/3702)
* The built-in diff editor now correctly retains the executable bit on newly
added files when splitting. [#3846](https://github.com/jj-vcs/jj/issues/3846)
* `jj config set`/`--config` value parsing rule is relaxed in a way that
unquoted apostrophes are allowed.
[#5748](https://github.com/jj-vcs/jj/issues/5748)
* `jj fix` could previously create new conflicts when a descendant of a fixed
revision was already correctly formatted.
### Contributors
Thanks to the people who made this release happen!
* Aleksey Kuznetsov (@zummenix)
* Anton Älgmyr (@algmyr)
* Austin Seipp (@thoughtpolice)
* Baltasar Dinis (@bsdinis)
* Benjamin Tan (@bnjmnt4n)
* Brandon Hall (@tenkabuto)
* Caleb White (@calebdw)
* Daniel Luz (@mernen)
* David Rieber (@drieber)
* demize (@demize)
* Emily (@emilazy)
* Evan Mesterhazy (@emesterhazy)
* Fedor Sheremetyev (@sheremetyev)
* George Christou (@gechr)
* Ilya Grigoriev (@ilyagr)
* Jakob Hellermann (@jakobhellermann)
* Jo Liss (@joliss)
* Joachim Desroches (@jedesroches)
* Johannes Altmanninger (@krobelus)
* Jonathan Gilchrist (@jgilchrist)
* Kenyon Ralph (@kenyon)
* Lucas Garron (@lgarron)
* Martin von Zweigbergk (@martinvonz)
* Nick Pupko (@npupko)
* Philip Metzger (@PhilipMetzger)
* Raphael Borun Das Gupta (@das-g)
* Remo Senekowitsch (@senekor)
* Robin Stocker (@robinst)
* Scott Taylor (@scott2000)
* Siva Mahadevan (@svmhdvn)
* Vincent Ging Ho Yim (@cenviity)
* Yuya Nishihara (@yuja)