About
jj is a Git-compatible version control system that is both simple and powerful. See
the installation instructions to get started.
Breaking changes
-
In revsets, symbol expressions (such as change ID prefix) no longer resolve to
multiple revisions, and error out if resolved to more than one revisions. Use
change_id(prefix)
orbookmarks(exact:name)
to query divergent changes or
conflicted bookmarks. Commands likejj rebase
no longer requireall:
to
specify multiple destination revisions. -
jj op abandon
now discards previous versions of a change (or predecessors)
if they become unreachable from the operation history. The evolution history
is truncated accordingly.Once
jj op abandon
andjj util gc
are run in a repository, old versions of
jj
might get "commit not found" error onjj evolog
. -
commit.working_copies()
template method now returnsList<WorkspaceRef>
-
The previously predefined
amend
alias has been removed. You can restore it
by setting the configaliases.amend = ["squash"]
.
Deprecations
-
The
all:
revset modifier andui.always-allow-large-revsets
setting is
planned to be removed in a future release.
#6016 -
Rename the
core.fsmonitor
andcore.watchman
settings to
fsmonitor.backend
, andfsmonitor.watchman
respectively.
New features
-
jj workspace list
now accepts-T
/--template
option to customize its
output via templates. -
Added
templates.workspace_list
template to customize the output of
jj workspace list
. -
jj fix
now buffers the standard error stream from subprocesses and emits
the output from each all at once. The file name is printed before the output. -
jj status
now collapses fully untracked directories into one line.
It still fully traverses them while snapshotting but they won't clutter up
the output with all of their contents. -
Add the
working-copy.eol-conversion
config which is similar to the git
core.autocrlf
config. A heuristics is used to detect if a file is a binary
file to prevent the EOL conversion from changing binary files unexpectedly. -
Add a
.parents()
method to the
Operation
type in the templating
language. -
Merge tools config can now explicitly forbid using them as diff editors or
diff formatters. Built-in tools that do not function well as diff editing
tools or as diff formatters will now report an error when used as such. -
jj diffedit
now accepts filesets to edit only the specified paths. -
AnnotationLine objects in templates now have a
original_line_number() -> Integer
method. -
Commit templates now support
.files()
to list all existing files at that
revision. -
Glob patterns now support
{foo,bar}
syntax. There may be subtle behavior
changes as we use the globset library now. -
The new
bisect(x)
revset function can help bisect a range of commits to
find when a bug was introduced. -
New
first_parent()
andfirst_ancestors()
revset functions which are
similar toparents()
andancestors()
, but only traverse the first parent
of each commit (similar to Git's--first-parent
option). -
New
signing.backends.ssh.revocation-list
config for specifying a list of revoked
public keys for commit signature verification. -
jj fix
commands now replace$root
with the workspace's root path. This is
useful for tools stored inside the workspace.
Fixed bugs
-
Fixed an error in
jj util gc
caused by the empty blob being missing from
the Git store. #7062 -
jj op diff -p
andjj op log -p
now show content diffs from the first
predecessor only. #7090 -
jj git fetch
no longer showsNaN%
progress when connecting to slow remotes.
#7155
Contributors
Thanks to the people who made this release happen!
- adamnemecek (@adamnemecek)
- Alexander Kobjolke (@jakalx)
- Apromixately (@Apromixately)
- Austin Seipp (@thoughtpolice)
- Bryce Berger (@bryceberger)
- Daniel Danner (@dnnr)
- Daniel Luz (@mernen)
- Evan Martin (@evmar)
- George Christou (@gechr)
- George Elliott-Hunter (@george-palmsens)
- Hubert Głuchowski (@afishhh)
- Ilya Grigoriev (@ilyagr)
- Jade Lovelace (@lf-)
- Jake Martin (@jake-m-commits)
- Jan Klass (@Kissaki)
- Joaquín Triñanes (@JoaquinTrinanes)
- Josh Steadmon (@steadmon)
- Kaiyi Li (@06393993)
- Martin von Zweigbergk (@martinvonz)
- Nigthknight (@nigthknight)
- Ori Avtalion (@salty-horse)
- Pablo Brasero (@pablobm)
- Pavan Kumar Sunkara (@pksunkara)
- Philip Metzger (@PhilipMetzger)
- phoebe (@phoreverpheebs)
- Remo Senekowitsch (@senekor)
- Scott Taylor (@scott2000)
- Stephen Jennings (@jennings)
- Theo Buehler (@botovq)
- Tyarel8 (@Tyarel8)
- Yuya Nishihara (@yuja)