- Add `jj arrange` command to reorder and abandon revisions in a TUI
- Add `jj bookmark advance` command to automatically move bookmarks forward to a target revision
- Add support for push options in `jj git push` with the `--option` flag and `-o` short alias
- Add `new_description` template evaluation in `jj new` to populate initial commit description
- Add `first()`, `last()`, `get(index)`, `reverse()`, `skip(count)`, and `take(count)` methods on list types in templates
- Add `builtin_draft_commit_description_with_diff` template that includes diff in commit description editor
- Add `name:x` pattern aliases in revsets and templates such as `grep:x`
- Add user aliases support in filesets
- Add `jj util snapshot` command to manually or programmatically trigger a snapshot
- Add `Timestamp::since(ts)` template function to return TimestampRange between two timestamps
- Add `--simplify-parents` flag to `jj rebase` to apply simplify-parents transformation
- Add support for new flags in `jj gerrit upload` including `--reviewer` and `--label`
- Add `--overwrite-existing` flag to `jj bookmark rename` to replace existing bookmarks
- Add conditional configuration support based on environment variables with `--when.environments`
- Relative paths now used by `jj workspace add` to enable workspaces in containers or when moved together
- `jj undo` now outputs what operation was undone in addition to the operation restored to
- Bookmarks with two or more consecutive `-` characters no longer require quoting in revsets
- `jj rebase --branch` and `jj rebase --source` now print a message instead of returning an error for empty revision sets
- Changed Git representation of conflicted commits to include files from first side of conflict
- Background snapshotting now suppresses stdout and stderr to avoid long hangs
- `jj gerrit upload` no longer requires the `-r` flag and defaults to uploading current work
- Windows: use native file locks (LockFileEx) instead of polling with file creation
- `jj` now safely detaches HEAD of alternate Git worktrees if their checked-out branch is moved or deleted
- `jj file track --include-ignored` now works when fsmonitor.backend is set to watchman
- Drop support for legacy index files written by jj < 0.33
- Remove deprecated config options `core.fsmonitor` and `core.watchman.register-snapshot-trigger`
- Remove deprecated command `jj op undo`
- `jj debug snapshot` is deprecated in favor of `jj util snapshot` and will be removed in v0.45.0
About
jj is a Git-compatible version control system that is both simple and powerful. See the installation instructions to get started.
Release highlights
-
jj arrangecommand brings up a TUI where you can reorder and abandon revisions. #1531 -
jj bookmark advanceautomatically moves bookmarks forward to a target revision (defaults to@) using customization pointsrevsets.bookmark-advance-fromandrevsets.bookmark-advance-to. It is heavily inspired by the longstanding community aliasjj 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.fsmonitorcore.watchman.register-snapshot-trigger
-
The deprecated command
jj op undohas been removed. Usejj op revertorjj undo/redoinstead.
Deprecations
jj debug snapshotis deprecated in favor ofjj 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 pushwith the--optionflag. This allows users to pass options to the remote server when pushing commits. The short alias-ois also supported. -
jj newnow evaluates thenew_descriptiontemplate to populate the initial commit description when no-mmessage is provided. -
Templates now support
first(),last(),get(index),reverse(),skip(count), andtake(count)methods on list types for more flexible list manipulation. -
New
builtin_draft_commit_description_with_difftemplate 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:xpattern aliases such as'grep:x' = 'description(regex:x)'. -
Filesets now support user aliases.
-
jj workspace addnow 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 undonow 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 asjj diff -r foo--bar. -
New flag
--simplify-parentsonjj rebaseto apply the same transformation asjj simplify-parentson the rebased commits. #7711 -
jj rebase --branchandjj rebase --sourcewill no longer return an error if the given argument resolves to an empty revision set (jj rebase --revisionsalready 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 theTimestampRangebetween two timestamps. It can be used in conjunction with.duration()in order to obtain a human-friendly duration between twoTimestamps. -
Added new
jj util snapshotcommand to manually or programmatically trigger a snapshot. This introduces an official alternative to the previously-undocumentedjj debug snapshotcommand. The Watchman integration has also been updated to use this command instead. -
Changed background snapshotting to suppress stdout and stderr to avoid long hangs.
-
jj gerrit uploadnow supports a variety of new flags documented in gerrit's documentation. This includes, for example,--reviewer=foo@example.comand--label=Auto-Submit. -
jj gerrit uploadnow recognizes Change-Id explicitly set via the alternative trailerLink, and will generate aLink: <review-url>/id/<change-id>trailer ifgerrit.review-urloption is set. -
jj gerrit uploadno longer requires the-rflag, and will default to uploading what you're currently working on. -
Templates now support
Serializeoperations on the result ofmap()andif(), when supported by the underlying type. -
jj bookmark renamenow supports--overwrite-existingto allow renaming a bookmark even if the new name already exists, effectively replacing the existing bookmark. -
Conditional configuration based on environment variables with
--when.environments. #8779
Fixed bugs
-
Windows: use native file locks (
LockFileEx) instead of polling with file creation, fixing issues with "pending delete" semantics leaving lock files stuck. -
jjnow safely detaches theHEADof alternate Git worktrees if their checked-out branch is moved or deleted during Git export. -
jj file track --include-ignorednow works whenfsmonitor.backend="watchman". #8427
Contributors
Thanks to the people who made this release happen!
- Aaron Christiansen (@AaronC81)
- Andy Brenneke (@abrenneke)
- Anton Älgmyr (@algmyr)
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Bram Geron (@bgeron)
- Bryce Berger (@bryceberger)
- Caleb White (@calebdw)
- countskm (@countdigi)
- David Higgs (@higgsd)
- Evan Simmons (@estk)
- Fedor Sheremetyev (@sheremetyev)
- Gaëtan Lehmann (@glehmann)
- George Christou (@gechr)
- Hubert Lefevre (@Paluche)
- Ian (@chronologos)
- Ilya Grigoriev (@ilyagr)
- Jaen (@jaens)
- Joseph Lou (@josephlou5)
- Josh Steadmon (@steadmon)
- Martin von Zweigbergk (@martinvonz)
- Matt Kulukundis (@fowles)
- Matt Stark (@matts1)
- max (@pr2502)
- Nika Layzell (@mystor)
- Philip Metzger (@PhilipMetzger)
- Richard Smith (@zygoloid)
- Scott Taylor (@scott2000)
- Steve Klabnik (@steveklabnik)
- Theodore Dubois (@tbodt)
- William Phetsinorath (@shikanime)
- xtqqczze (@xtqqczze)
- Yuya Nishihara (@yuja)