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 points
revsets.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 revertor
jj 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 theTimestampRange
between 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()and
if(), 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)