About
jj is a Git-compatible version control system that is both simple and powerful. See
the installation instructions to get started.
Breaking changes
-
Revset expressions like hidden_id | description(x) now search the specified
hidden revision and its ancestors as well
as all visible revisions. -
Commit templates no longer normalize description by appending final newline
character. Use description.trim_end() ++ "\n" if needed.
Deprecations
- The git.push-bookmark-prefix setting is deprecated in favor of
templates.git_push_bookmark, which supports templating. The old setting can
be expressed in template as "<prefix>" ++ change_id.short().
New features
-
New change_id(prefix)/commit_id(prefix) revset functions to explicitly
query commits by change/commit ID prefix. -
The parents() and children() revset functions now accept an optional
depth argument. For instance, parents(x, 3) is equivalent to x---, and
children(x, 3) is equivalent to x+++. -
jj evolog can now follow changes from multiple revisions such as divergent
revisions. -
jj diff now accepts -T/--template option to customize summary output.
-
Log node templates are now specified in toml rather than hardcoded.
-
Templates now support json(x) function to serialize values in JSON format.
-
The ANSI 256-color palette can be used when configuring colors. For example,
colors."diff removed token" = { bg = "ansi-color-52", underline = false }
will apply a dark red background on removed words in diffs.
Fixed bugs
-
jj file annotate can now process files at a hidden revision.
-
jj op log --op-diff no longer fails at displaying "reconcile divergent
operations." #4465 -
jj util gc --expire=now now passes the corresponding flag to git gc.
-
change_id/commit_id.shortest() template functions now take conflicting
bookmark and tag names into account.
#2416 -
Fixed lockfile issue on stale file handles observed with NFS.
Packaging changes
- aarch64-windows builds (release binaries and main snapshots) are now provided.
Contributors
Thanks to the people who made this release happen!
- Anton Älgmyr (@algmyr)
- Austin Seipp (@thoughtpolice)
- Benjamin Brittain (@benbrittain)
- Cyril Plisko (@imp)
- Daniel Luz (@mernen)
- Gaëtan Lehmann (@glehmann)
- Gilad Woloch (@giladwo)
- Greg Morenz (@gmorenz)
- Igor Velkov (@iav)
- Ilya Grigoriev (@ilyagr)
- Jade Lovelace (@lf-)
- Jonas Greitemann (@jgreitemann)
- Josh Steadmon (@steadmon)
- juemrami (@juemrami)
- Kaiyi Li (@06393993)
- Lars Francke (@lfrancke)
- Martin von Zweigbergk (@martinvonz)
- Osama Qarem (@osamaqarem)
- Philip Metzger (@PhilipMetzger)
- raylu (@raylu)
- Scott Taylor (@scott2000)
- Vincent Ging Ho Yim (@cenviity)
- Yuya Nishihara (@yuja)