About
jj is a Git-compatible version control system that is both simple and powerful. See the installation instructions to get started.
Release highlights
-
New
jj absorbcommand automatically squashes changes from the current commit into relevant ancestor commits. -
Experimental dynamic shell completions have been added; see the docs for configuration.
-
jj duplicatenow accepts--destination/--insert-before/--insert-after. -
Some deprecated commands have been removed (
jj move,jj checkout,jj merge).
Breaking changes
-
jj movehas been removed. It was deprecated in 0.16.0. -
jj checkoutand the built-in aliasjj cohave been removed.
It was deprecated in 0.14.0. -
jj mergehas been removed. It was deprecated in 0.14.0. -
jj git pushno longer pushes new bookmarks by default. Use--allow-newto
bypass this restriction. -
Lines prefixed with "JJ:" in commit descriptions and in sparse patterns (from
jj sparse edit) are now stripped even if they are not immediately followed
by a space. #5004
Deprecations
New features
-
Templates now support the
==and!=logical operators forBoolean,
Integer, andStringtypes. -
New command
jj absorbthat moves changes to stack of mutable revisions. -
New command
jj util execthat can be used for arbitrary aliases. -
jj rebase -bcan now be used with the--insert-afterand--insert-before
options, likejj rebase -randjj rebase -s. -
A preview of improved shell completions was added. Please refer to the
documentation
to activate them. They additionally complete context-dependent, dynamic values
like bookmarks, aliases, revisions, operations and files. -
Added the config setting
snapshot.auto-update-stalefor automatically
runningjj workspace update-stalewhen applicable. -
jj duplicatenow accepts--destination,--insert-afterand
--insert-beforeoptions to customize the location of the duplicated
revisions. -
jj lognow displays the working-copy branch first. -
New
fork_point()revset function can be used to obtain the fork point
of multiple commits. -
The
tags()revset function now takes an optionalpatternargument,
mirroring that ofbookmarks(). -
Several commands now support
-f/-tshorthands for--from/--to:diffdiffeditinterdiffop diffrestore
-
New
ui.conflict-marker-styleconfig option to change how conflicts are
materialized in the working copy. The default option ("diff") renders
conflicts as a snapshot with a list of diffs to apply to the snapshot.
The new "snapshot" option renders conflicts as a series of snapshots, showing
each side and base of the conflict. The new "git" option replicates Git's
"diff3" conflict style, meaning it is more likely to work with external tools,
but it doesn't support conflicts with more than 2 sides. -
New
merge-tools.<TOOL>.conflict-marker-styleconfig option to override the
conflict marker style used for a specific merge tool. -
New
merge-tools.<TOOL>.merge-conflict-exit-codesconfig option to allow a
merge tool to exit with a non-zero code to indicate that not all conflicts
were resolved. -
jj simplify-parentsnow supports configuring the default revset when no
--sourceor--revisionsarguments are provided with the
revsets.simplify-parentsconfig.
Fixed bugs
jj config unset <TABLE-NAME>no longer removes a table (such as[ui].)
Contributors
Thanks to the people who made this release happen!
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Daniel Ploch (@torquestomp)
- Emily (@neongreen)
- Essien Ita Essien (@essiene)
- Herman J. Radtke III (@hjr3)
- Ilya Grigoriev (@ilyagr)
- Joaquín Triñanes (@JoaquinTrinanes)
- Lars Francke (@lfrancke)
- Luke Randall (@lukerandall)
- Martin von Zweigbergk (@martinvonz)
- Nathanael Huffman (@nathanaelhuffman)
- Philip Metzger (@PhilipMetzger)
- Remo Senekowitsch (@senekor)
- Robin Stocker (@robinst)
- Scott Taylor (@scott2000)
- Shane Sveller (@shanesveller)
- Tim Janik (@tim-janik)
- Yuya Nishihara (@yuja)