Releases: jj-vcs/jj
v0.28.2
Fixed bugs
- Fixed problem that old commits could be re-imported from Git.
GitoxideLabs/gitoxide#1928
v0.28.1
Note
Also see the v0.28.0 release notes.
About
jj is a Git-compatible version control system that is both simple and powerful. See the installation instructions to get started.
Security fixes
- Fixed SHA-1 collision attacks not being detected.
(GHSA-794x-2rpg-rfgr)
Fixed bugs
-
Resolved some potential build issues for packagers.
#6232 -
Fix a bug with
:ours
and:theirs
merge tools involving conflicted trees
with more than two sides. #6227
Contributors
Thanks to the people who made this release happen!
- Emily (@emilazy)
- Ilya Grigoriev (@ilyagr)
- Nicole Patricia Mazzuca (@strega-nil)
- Scott Taylor (@scott2000)
- Yuya Nishihara (@yuja)
v0.28.0
Important
v0.28.0 was yanked from https://crates.io and superseded by v0.28.1.
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's configuration can now be split into multiple files more easily.
-
jj resolve
now accepts built-in tools:ours
and:theirs
. -
In colocated repos, newly-created files will now appear in
git diff
. -
A long-standing bug relating to empty files in the built-in diff editor was
fixed. #3702
Breaking changes
-
The minimum supported Rust version (MSRV) is now 1.84.0.
-
The
git.push-branch-prefix
config has been removed in favor of
git.push-bookmark-prefix
. -
jj abandon
no longer supports--summary
to suppress the list of abandoned
commits. The list won't show more than 10 commits to not clutter the console. -
jj unsquash
has been removed in favor ofjj squash
and
jj diffedit --restore-descendants
. -
The
jj untrack
subcommand has been removed in favor ofjj file untrack
. -
The following deprecated revset functions have been removed:
branches()
,remote_branches()
,tracked_remote_branches()
, and
untracked_remote_branches()
, which were renamed to "bookmarks".file()
andconflict()
, which were renamed to plural forms.files(x, y, ..)
with multiple patterns. Usefiles(x|y|..)
instead.
-
The following deprecated template functions have been removed:
branches()
,local_branches()
, andremote_branches()
, which were
renamed to "bookmarks".
-
The flags
--all
and--tracked
onjj git push
by themself do not cause
deleted bookmarks to be pushed anymore, as an additional safety measure. They
can now be combined with--deleted
instead.
Deprecations
-
core.watchman.register_snapshot_trigger
has been renamed tocore.watchman.register-snapshot-trigger
for consistency with other configuration options. -
jj backout
is deprecated in favor ofjj revert
.
New features
-
jj sign
can now sign with PKCS#12 certificates through thegpgsm
backend. -
jj sign
will automatically use the gpg key associated with the author's email
in the absence of asigning.key
configuration. -
Multiple user configs are now supported and are loaded in the following precedence order:
$HOME/.jjconfig.toml
$XDG_CONFIG_HOME/jj/config.toml
$XDG_CONFIG_HOME/jj/conf.d/*.toml
-
The
JJ_CONFIG
environment variable can now contain multiple paths separated
by a colon (or semicolon on Windows). -
The command
jj config list
now supports showing the origin of each variable
via thebuiltin_config_list_detailed
template. -
jj config {edit,set,unset}
now prompt when multiple config files are found. -
jj diff -r
now allows multiple revisions (as long as there are no gaps in
the revset), such asjj diff -r 'mutable()'
. -
jj git push
now accepts a--named NAME=REVISION
argument to create a named
bookmark and immediately push it. -
The 'how to resolve conflicts' hint that is shown when conflicts appear can
be hidden by settinghints.resolving-conflicts = false
. -
jj op diff
andjj op log --op-diff
now show changes to which commits
correspond to working copies. -
jj op log -d
is now an alias forjj op log --op-diff
. -
jj bookmark move --to/--from
can now be abbreviated tojj bookmark move -t/-f
-
jj bookmark list
now supports--sort
option. Similar togit branch --sort
.
Seejj bookmark list --help
for more details. -
A new command
jj revert
is added, which is similar tojj backout
but
adds the--destination
,--insert-after
, and--insert-before
options to
customize the location of reverted commits. -
A new command
jj git root
is added, which prints the location of the Git
directory of a repository using the Git backend. -
In colocated repos, any files that jj considers added in the working copy will
now show up ingit diff
(as if you had rungit add --intent-to-add
on
them). -
Reversing colors is now supported. For example, to highlight words by
reversing colors rather than underlining, you can set
colors."diff token"={ underline = false, reverse = true }
in your config. -
Added
revsets.log-graph-prioritize
, which can be used to configure
which branch in thejj log
graph is displayed on the left instead of@
(e.g.coalesce(description("megamerge\n"), trunk())
) -
jj resolve
now accepts new built-in merge tools:ours
and:theirs
.
These merge tools accept side #1 and side #2 of the conflict respectively.
Fixed bugs
-
jj log -p --stat
now shows diff stats as well as the default color-words/git
diff output. #5986 -
The built-in diff editor now correctly handles deleted files.
#3702 -
The built-in diff editor now correctly retains the executable bit on newly
added files when splitting. #3846 -
jj config set
/--config
value parsing rule is relaxed in a way that
unquoted apostrophes are allowed.
#5748 -
jj fix
could previously create new conflicts when a descendant of a fixed
revision was already correctly formatted.
Contributors
Thanks to the people who made this release happen!
- Aleksey Kuznetsov (@zummenix)
- Anton Älgmyr (@algmyr)
- Austin Seipp (@thoughtpolice)
- Baltasar Dinis (@bsdinis)
- Benjamin Tan (@bnjmnt4n)
- Brandon Hall (@tenkabuto)
- Caleb White (@calebdw)
- Daniel Luz (@mernen)
- David Rieber (@drieber)
- demize (@demize)
- Emily (@emilazy)
- Evan Mesterhazy (@emesterhazy)
- Fedor Sheremetyev (@sheremetyev)
- George Christou (@gechr)
- Ilya Grigoriev (@ilyagr)
- Jakob Hellermann (@jakobhellermann)
- Jo Liss (@joliss)
- Joachim Desroches (@jedesroches)
- Johannes Altmanninger (@krobelus)
- Jonathan Gilchrist (@jgilchrist)
- Kenyon Ralph (@kenyon)
- Lucas Garron (@lgarron)
- Martin von Zweigbergk (@martinvonz)
- Nick Pupko (@npupko)
- Philip Metzger (@PhilipMetzger)
- Raphael Borun Das Gupta (@das-g)
- Remo Senekowitsch (@senekor)
- Robin Stocker (@robinst)
- Scott Taylor (@scott2000)
- Siva Mahadevan (@svmhdvn)
- Vincent Ging Ho Yim (@cenviity)
- Yuya Nishihara (@yuja)
v0.27.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
git.subprocess
is now enabled by default, improving compatibility with Git
fetches and pushes by spawning an externalgit
process. Users can opt out
of this by settinggit.subprocess = false
, but this will likely be removed
in a future release. Please report any issues you run into.
Breaking changes
-
Bookmark name to be created/updated is now parsed as a revset
symbol. Quotation may be needed in addition to shell
quotes. Example:jj bookmark create -r@- "'name with space'"
-
jj bookmark create
,jj bookmark set
andjj bookmark move
onto a hidden
commit make it visible. -
jj bookmark forget
now untracks any corresponding remote bookmarks instead
of forgetting them, since forgetting a remote bookmark can be unintuitive.
The old behavior is still available with the new--include-remotes
flag. -
jj fix
now always sets the working directory of invoked tools to be the
workspace root, instead of the working directory of thejj fix
. -
The
ui.allow-filesets
configuration option has been removed.
The "fileset" language has been enabled by default since v0.20. -
templates.annotate_commit_summary
is renamed totemplates.file_annotate
,
and now has an implicitself
parameter of typeAnnotationLine
, instead of
Commit
. All methods onCommit
can be accessed withcommit.method()
, or
self.commit().method()
.
Deprecations
-
This release takes the first steps to make target revision required in
bookmark create
,bookmark move
andbookmark set
. Those commands will display
a warning if the user does not specify target revision explicitly. In the near
future those commands will fail if target revision is not specified. -
The
signing.sign-all
config option has been deprecated in favor of
signing.behavior
. The new option acceptsdrop
(never sign),keep
(preserve
existing signatures),own
(sign own commits), orforce
(sign all commits).
Existingsigning.sign-all = true
translates tosigning.behavior = "own"
, and
false
translates to"keep"
. Invalid configuration is now an error.
New features
-
The new
jj sign
andjj unsign
commands allow for signing/unsigning commits.
jj sign
supports configuring the default revset throughrevsets.sign
when
no--revisions
arguments are provided. -
jj git fetch
now supports string pattern syntax
on--remote
option andgit.fetch
configuration. -
Template functions
truncate_start()
andtruncate_end()
gained an optional
ellipsis
parameter; passing this prepends or appends the ellipsis to the
content if it is truncated to fit the maximum width. -
Templates now support
stringify(x)
function and string method
.escape_json()
. The latter serializes the string in JSON format. It is
useful for making machine-readable templates by escaping problematic
characters like\n
. -
Templates now support
trim()
,trim_start()
andtrim_end()
methods
which remove whitespace from the start and end of aString
type. -
The description of commits backed out by
jj backout
can now be configured
usingtemplates.backout_description
. -
New
AnnotationLine
templater type. Used intemplates.file_annotate
.
Providesself.commit()
,.content()
,.line_number()
, and
.first_line_in_hunk()
. -
Templates now have
format_short_operation_id(id)
function for users to
customize the default operation id representation. -
The
jj init
/jj revert
stubs that print errors can now be overridden with
aliases. All ofjj clone/init/revert
add a hint to a generic error. -
Help text is now colored (when stdout is a terminal).
-
Commands that used to suggest
--ignore-immutable
now print the number of
immutable commits that would be rewritten if used and a link to the docs. -
jj undo
now shows a hint when undoing an undo operation that the user may
be looking forjj op restore
instead.
Fixed bugs
-
jj status
now shows untracked files under untracked directories.
#5389 -
Added workaround for the bug that untracked files are ignored when watchman is
enabled. #5728 -
The
signing.backends.ssh.allowed-signers
configuration option will now
expand~/
to$HOME/
.
#5626 -
config-schema.json
now allows arrays of strings for the settingsui.editor
andui.diff.tool
. -
config-schema.json
now allows an array of strings or nested table for the
ui.pager
setting.
Contributors
Thanks to the people who made this release happen!
- Alain Leufroy (@aleufroy)
- Aleksey Kuznetsov (@zummenix)
- Alexander Mikhailov (@AM5800)
- Andrew Gilbert (@andyg0808)
- Antoine Martin (@alarsyo)
- Anton Bulakh (@necauqua)
- Austin Seipp (@thoughtpolice)
- Baltasar Dinis (@bsdinis)
- Benjamin Tan (@bnjmnt4n)
- Bryce Berger (@bryceberger)
- Burak Varlı (@unexge)
- David Rieber (@drieber)
- Emily (@emilazy)
- Evan Mesterhazy (@emesterhazy)
- George Christou (@gechr)
- HKalbasi (@HKalbasi)
- Ilya Grigoriev (@ilyagr)
- Jacob Hayes (@JacobHayes)
- Jonathan Frere (@MrJohz)
- Jonathan Tan (@jonathantanmy)
- Josh Steadmon (@steadmon)
- maan2003 (@maan2003)
- Martin von Zweigbergk (@martinvonz)
- Matthew Davidson (@KingMob)
- Philip Metzger (@PhilipMetzger)
- Philipp Albrecht (@pylbrecht)
- Roman Timushev (@rtimush)
- Samuel Tardieu (@samueltardieu)
- Scott Taylor (@scott2000)
- Stephan Hügel (@urschrei)
- Vincent Ging Ho Yim (@cenviity)
- Yuya Nishihara (@yuja)
v0.26.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
-
Improved Git push/fetch compatibility by spawning an external
git
process.
This can be enabled by thegit.subprocess=true
config knob, and will be the
default in a future release. -
jj log
can now show cryptographic commit signatures. The output can be
controlled by theui.show-cryptographic-signatures=true
config knob.
Breaking changes
-
jj abandon
now deletes bookmarks pointing to the revisions to be abandoned.
Use--retain-bookmarks
to move bookmarks backwards. If deleted bookmarks
were tracking remote bookmarks, the associated bookmarks (or branches) will be
deleted from the remote onjj git push --all
.
#3505 -
jj init --git
andjj init --git-repo
have been removed. They were
deprecated in early 2024. Usejj git init
instead. -
The following deprecated commands have been removed:
jj cat
is replaced byjj file show
.jj chmod
is replaced byjj file chmod
.jj files
is replaced byjj file list
.
-
The deprecated
-l
short alias for--limit
injj log
,jj op log
andjj obslog
has been removed. The-n
short alias can be used instead. -
The deprecated
--siblings
options forjj split
has been removed.
jj split --parallel
can be used instead. -
The deprecated
fix.tool-command
config option has been removed. -
In colocated repos, the Git index now contains the changes from all parents
of the working copy instead of just the first parent (HEAD
). 2-sided
conflicts from the merged parents are now added to the Git index as conflicts
as well. -
The following change introduced in 0.25.0 is reverted:
jj config list
now prints inline tables{ key = value, .. }
literally.
Inner items of inline tables are no longer merged across configuration
files.
-
jj resolve
will now attempt to resolve all conflicted files instead of
resolving the first conflicted file. To resolve a single file, pass a file
path tojj resolve
. -
jj util mangen
is replaced withjj util install-man-pages
, which can
install man pages for alljj
subcommands to a given path. -
In
jj config list
template,value
is now typed asConfigValue
, not as
String
serialized in TOML syntax. -
jj git remote add
/set-url
now converts relative Git remote path to
absolute path. -
jj log
/op log
now applies-n
/--limit
before the items are reversed.
Rationale: It's more useful to see the N most recent commits/operations, and
is more performant. The old behavior can be achieved byjj log .. | head
.
#5403 -
Upgraded
scm-record
from v0.4.0 to v0.5.0. See release notes at
https://github.com/arxanas/scm-record/releases/tag/v0.5.0. -
The builtin pager is switched to
streampager. It can handle large
inputs better and can be configured. -
Conflicts materialized in the working copy before
jj 0.19.0
may no longer
be parsed correctly. If you are using version 0.18.0 or earlier, check out a
non-conflicted commit before upgrading to prevent issues.
Deprecations
New features
-
jj git {push,clone,fetch}
can now spawn an externalgit
subprocess, via
thegit.subprocess = true
config knob. This provides an alternative that,
when turned on, fixes SSH bugs when interacting with Git remotes due to
libgit2
s limitations #4979. -
jj describe
now accepts--edit
. -
jj evolog
andjj op log
now accept--reversed
. -
jj restore
now supports-i
/--interactive
selection. -
jj file list
now supports templating. -
There is a new
builtin_op_log_oneline
template alias you can pass tojj op log -T
for a more compact output. You can useformat_operation_oneline
and
format_snapshot_operation_oneline
to customize parts of it. -
New template function
config(name)
to access to configuration variable from
template. -
New template function
pad_centered()
to center content within a minimum
width. -
Templater now supports
list.filter(|x| ..)
method. -
The
diff
commit template keyword now supports custom formatting via
diff.files()
. For example,diff.files().map(|e| e.path().display())
prints
changed file paths. -
The
diff.stat()
template method now provides methods to get summary values. -
jj log
can now show cryptographic commit signatures. The output can be
controlled by theui.show-cryptographic-signatures=true
config knob. The
signature template can be customized using
format_detailed_cryptographic_signature(signature)
and
format_short_cryptographic_signature(signature)
. -
New
git.sign-on-push
config option to automatically sign commits which are
being pushed to a Git remote. -
New
git.push-new-bookmarks
config option to push new bookmarks without
--allow-new
. -
jj status
now shows untracked files when they reside directly under a
tracked directory. There's still an issue that files under untracked
directories aren't listed. #5389 -
New
merge-tools.<TOOL>.diff-expected-exit-codes
config option to suppress
warnings from tools exiting with non-zero exit codes. -
New
fix.tools.TOOL.enabled
config option to enable/disable tools. This is
useful for defining disabled tools in user configuration that can be enabled
in individual repositories with one config setting. -
Added
--into
flag tojj restore
, similarly tojj squash
andjj absorb
. It is equivalent to--to
, but--into
is the recommended name. -
Italic text is now supported. You can set e.g.
color.error = { fg = "red", italic = true }
in your config. -
New
author_name
/author_email
/committer_name
/committer_email(pattern)
revset functions to match either name or email field explicitly. -
New
subject(pattern)
revset function that matches first line of commit
descriptions. -
Conditional configuration now supports
--when.commands
to change
configuration based on subcommand. -
The Jujutsu documentation site now publishes a schema for the official
configuration file, which can be integrated into your editor for autocomplete,
inline errors, and more.
Please see the documentation for more
on this.
Fixed bugs
-
jj git fetch
with multiple remotes will now fetch from all remotes before
importing refs into the jj repo. This fixes a race condition where the
treatment of a commit that is found in multiple fetch remotes depended on the
order the remotes were specified. -
Fixed diff selection by external tools with
jj split
/commit -i FILESETS
.
#5252 -
Conditional configuration now applies when initializing new repository.
#5144 -
[diff.<format>]
configuration now applies to.diff().<format>()
commit
template methods. -
Conflicts at the end of files which don't end with a newline character are
now materialized in a way that can be parsed correctly.
#3968 -
Bookmark and remote names written by
jj git clone
to
revset-aliases.'trunk()'
are now escaped if necessary.
#5359
Contributors
Thanks to the people who made this release happen!
- Angel Ezquerra (@AngelEzquerra)
- Antoine Martin (@alarsyo)
- Anton Bulakh (@necauqua)
- Austin Seipp (@thoughtpolice)
- Baltasar Dinis (@bsdinis)
- Benjamin Tan (@bnjmnt4n)
- blinry (@blinry)
- Bryce Berger (@bryceberger)
- Charlie-83 (@Charlie-83)
- Christian Stoitner (@cstoitner)
- Evan Martin (@evmar)
- George Christou (@gechr)
- Ilya Grigoriev (@ilyagr)
- Jakob Hellermann (@jakobhellermann)
- JDSeiler (@JDSeiler)
- Jonathan Frere (@MrJohz)
- Jonathan Gilchrist (@jgilchrist)
- Josh Steadmon (@steadmon)
- Martin von Zweigbergk (@martinvonz)
- Matt Kulukundis (@fowles)
- Ollivier Robert (@keltia)
- Philip Metzger (@PhilipMetzger)
- Philipp Albrecht (@pylbrecht)
- Robert Jackson (@rwjblue)
- Samuel Tardieu (@samueltardieu)
- Scott Taylor (@scott2000)
- Stephen Jennings (@jennings)
- Valentin Gatien-Baron (@v-gb)
- Vincent Ging Ho Yim (@cenviity)
- Waleed Khan (@arxanas)
- Yuya Nishihara (@yuja)
v0.25.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
It's the holidays, and this release was overall pretty quiet, without many major
changes. Two select improvements:
-
Improvements to configuration management, including support for conditional
variables in config files. -
Large files in the working copy will no longer cause commands to fail; instead
the large files will remain intact but untracked in the working copy.
Breaking changes
-
Configuration variables are no longer "stringly" typed. For example,
true
is
not converted to a string"true"
, and vice versa. -
The following configuration variables are now parsed strictly:
colors.<labels>
,git.abandon-unreachable-commits
,
git.auto-local-bookmark
,git.push-bookmark-prefix
,revsets.log
,
revsets.short-prefixes
signing.backend
,operation.hostname
,
operation.username
,ui.allow-init-native
,ui.color
,
ui.default-description
,ui.progress-indicator
,ui.quiet
,user.email
,
user.name
-
jj config list
now prints inline tables{ key = value, .. }
literally.
Inner items of inline tables are no longer merged across configuration files.
See the table syntax documentation for details. -
jj config edit --user
now opens a file even if$JJ_CONFIG
points to a
directory. If there are multiple config files, the command will fail. -
jj config set
no longer accepts a bare string value that looks like a TOML
expression. For example,jj config set NAME '[foo]'
must be quoted asjj config set NAME '"[foo]"'
. -
The deprecated
[alias]
config section is no longer respected. Move command
aliases to the[aliases]
section. -
jj absorb
now abandons the source commit if it becomes empty and has no
description.
Deprecations
-
--config-toml=TOML
is deprecated in favor of--config=NAME=VALUE
and
--config-file=PATH
. -
The
Signature.username()
template method is deprecated for
Signature().email().local()
.
New features
-
jj
command no longer fails due to new working-copy files larger than the
snapshot.max-new-file-size
config option. It will print a warning and large
files will be left untracked. -
Configuration files now support conditional variables.
-
New command options
--config=NAME=VALUE
and--config-file=PATH
to set
string value without quoting and to load additional configuration from files. -
Templates now support the
>=
,>
,<=
, and<
relational operators for
Integer
types. -
A new Email template type is added.
Signature.email()
now returns an Email
template type instead of a String. -
Adds a new template alias
commit_timestamp(commit)
which defaults to the
committer date. -
Conflict markers are now allowed to be longer than 7 characters, allowing
conflicts to be materialized and parsed correctly in files which already
contain lines that look like conflict markers. -
New
$marker_length
variable to allow merge tools to support longer conflict
markers (equivalent to "%L" for Git merge drivers). -
jj describe
now accepts aJJ: ignore-rest
line that ignores everything
below it, similar to a "scissor line" in git. When editing multiple commits,
only ignore until the nextJJ: describe
line.
Fixed bugs
-
The
$NO_COLOR
environment variable must now be non-empty to be respected. -
Fixed incompatible rendering of empty hunks in git/unified diffs. #5049
-
Fixed performance of progress bar rendering when fetching from Git remote. #5057
-
jj config path --user
no longer creates new file at the default config path. -
On Windows, workspace paths (printed by
jj root
) no longer use UNC-style
\\?\
paths unless necessary. -
On Windows,
jj git clone
now converts local Git remote path to
slash-separated path. -
jj resolve
no longer removes the executable bit on resolved files when using
an external merge tool.
Contributors
Thanks to the people who made this release happen!
- Alex Stefanov (@umnikos)
- Anton Älgmyr (@algmyr)
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Bryce Berger (@bryceberger)
- Daniel Ploch (@torquestomp)
- David Crespo (@david-crespo)
- George Tsiamasiotis (@gtsiam)
- Jochen Kupperschmidt (@homeworkprod)
- Keane Nguyen (@keanemind)
- Martin von Zweigbergk (@martinvonz)
- Matt Kulukundis (@fowles)
- Milo Moisson (@mrnossiom)
- petricavalry (@petricavalry)
- Philip Metzger (@PhilipMetzger)
- Remo Senekowitsch (@senekor)
- Scott Taylor (@scott2000)
- Shane Sveller (@shanesveller)
- Stephen Jennings (@jennings)
- Tim Janik (@tim-janik)
- Vamsi Avula (@avamsi)
- Waleed Khan (@arxanas)
- Yuya Nishihara (@yuja)
v0.24.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
-
New
jj absorb
command automatically squashes changes from the current commit into relevant ancestor commits. -
Experimental dynamic shell completions have been added; see the docs for configuration.
-
jj duplicate
now accepts--destination
/--insert-before
/--insert-after
. -
Some deprecated commands have been removed (
jj move
,jj checkout
,jj merge
).
Breaking changes
-
jj move
has been removed. It was deprecated in 0.16.0. -
jj checkout
and the built-in aliasjj co
have been removed.
It was deprecated in 0.14.0. -
jj merge
has been removed. It was deprecated in 0.14.0. -
jj git push
no longer pushes new bookmarks by default. Use--allow-new
to
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
, andString
types. -
New command
jj absorb
that moves changes to stack of mutable revisions. -
New command
jj util exec
that can be used for arbitrary aliases. -
jj rebase -b
can now be used with the--insert-after
and--insert-before
options, likejj rebase -r
andjj 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-stale
for automatically
runningjj workspace update-stale
when applicable. -
jj duplicate
now accepts--destination
,--insert-after
and
--insert-before
options to customize the location of the duplicated
revisions. -
jj log
now 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 optionalpattern
argument,
mirroring that ofbookmarks()
. -
Several commands now support
-f/-t
shorthands for--from/--to
:diff
diffedit
interdiff
op diff
restore
-
New
ui.conflict-marker-style
config 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-style
config option to override the
conflict marker style used for a specific merge tool. -
New
merge-tools.<TOOL>.merge-conflict-exit-codes
config option to allow a
merge tool to exit with a non-zero code to indicate that not all conflicts
were resolved. -
jj simplify-parents
now supports configuring the default revset when no
--source
or--revisions
arguments are provided with the
revsets.simplify-parents
config.
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)
v0.23.0
Security fixes
- Fixed path traversal by cloning/checking out crafted Git repository containing
..
,.jj
,.git
paths. (GHSA-88h5-6w7m-5w56; CVE-2024-51990)
Breaking changes
-
Revset function names can no longer start with a number.
-
Evaluation error of
revsets.short-prefixes
configuration is now reported. -
The
HEAD@git
symbol no longer resolves to the Git HEAD revision. Use
git_head()
or@-
revset expression instead. Thegit_head
template
keyword now returns a boolean. -
Help command doesn't work recursively anymore, i.e.
jj workspace help root
doesn't work anymore. -
The color label
op_log
from the[colors]
config section now only
applies to the op log and not to the other places operations are displayed. In
almost all cases, if you configuredop_log
before, you should use the new
operation
label instead. -
Default operation log template now shows end times of operations instead of
start times.
Deprecations
git.auto-local-bookmark
replacesgit.auto-local-branch
. The latter remains
supported for now (at lower precedence than the former).
New features
-
Added diff options to ignore whitespace when comparing lines. Whitespace
changes are still highlighted. -
New command
jj simplify-parents
will remove redundant parent edges. -
jj squash
now supports-f/-t
shorthands for--from/--[in]to
. -
Initial support for shallow Git repositories has been implemented. However,
deepening the history of a shallow repository is not yet supported. -
jj git clone
now accepts a--depth <DEPTH>
option, which
allows to clone the repository with a given depth. -
New command
jj file annotate
that annotates files line by line. This is similar
in functionality togit blame
. Invoke the command withjj file annotate <file_path>
.
The output can be customized via thetemplates.annotate_commit_summary
config variable. -
jj bookmark list
gained a--remote REMOTE
option to display bookmarks
belonging to a remote. This option can be combined with--tracked
or
--conflicted
. -
New command
jj config unset
that unsets config values. For example,
jj config unset --user user.name
. -
jj help
now has the flag--keyword
(shorthand-k
), which can give help
for some keywords (e.g.jj help -k revsets
). To see a list of the available
keywords you can dojj help --help
. -
New
at_operation(op, expr)
revset can be used in order to query revisions
based on historical state. -
String literals in filesets, revsets and templates now support hex bytes
(with\e
as escape / shorthand for\x1b
). -
New
coalesce(revsets...)
revset which returns commits in the first revset
in therevsets
list that does not evaluate tonone()
. -
New template function
raw_escape_sequence(...)
preserves escape sequences. -
Timestamp objects in templates now have
after(date) -> Boolean
and
before(date) -> Boolean
methods for comparing timestamps to other dates. -
New template functions
pad_start()
,pad_end()
,truncate_start()
, and
truncate_end()
are added. -
Add a new template alias
builtin_log_compact_full_description()
. -
Added the config settings
diff.color-words.context
anddiff.git.context
to
control the default number of lines of context shown.
Fixed bugs
-
Error on
trunk()
revset resolution is now handled gracefully.
#4616 -
Updated the built-in diff editor
scm-record
to version
0.4.0, which
includes multiple fixes.
Contributors
Thanks to the people who made this release happen!
- Alec Snyder (@allonsy)
- Arthur Grillo (Grillo-0)
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Dave Townsend (@Mossop)
- Daniel Ploch (@torquestomp)
- Emily (@neongreen)
- Essien Ita Essien (@essiene)
- Fedor Sheremetyev (@sheremetyev)
- Ilya Grigoriev (@ilyagr)
- Jakub Okoński (@farnoy)
- Jcparkyn (@Jcparkyn)
- Joaquín Triñanes (@JoaquinTrinanes)
- Lukas Wirth (@Veykril)
- Marco Neumann (@crepererum)
- Martin von Zweigbergk (@martinvonz)
- Matt Stark (@matts1)
- Philip Metzger (@PhilipMetzger)
- Philipp Albrecht (@pylbrecht)
- Remo Senekowitsch (@senekor)
- Richard Macklin (@rmacklin)
- Robin Stocker (@robinst)
- Samuel Tardieu (@samueltardieu)
- Sora (@SoraTenshi)
- Stephen Jennings (@jennings)
- Theodore Ehrenborg (@TheodoreEhrenborg)
- Vamsi Avula (@avamsi)
- Vincent Ging Ho Yim (@cenviity)
- Yuya Nishihara (@yuja)
v0.22.0
Breaking changes
-
Fixing #4239 means the
ordering of some messages have changed. -
Invalid
ui.graph.style
configuration is now an error. -
The builtin template
branch_list
has been renamed tobookmark_list
as part
of thejj branch
deprecation.
Deprecations
-
jj branch
has been deprecated in favor ofjj bookmark
.Rationale: Jujutsu's branches don't behave like Git branches, which a
confused many newcomers, as they expected a similar behavior given the name.
We've renamed them to "bookmarks" to match the actual behavior, as we think
that describes them better, and they also behave similar to Mercurial's
bookmarks. -
jj obslog
is now calledjj evolution-log
/jj evolog
.jj obslog
remains
as an alias. -
jj unsquash
has been deprecated in favor ofjj squash
and
jj diffedit --restore-descendants
.Rationale:
jj squash
can be used in interactive mode to pull
changes from one commit to another, including from a parent commit
to a child commit. For fine-grained dependent diffs, such as when
the parent and the child commits must successively modify the same
location in a file,jj diffedit --restore-descendants
can be used
to set the parent commit to the desired content without altering the
content of the child commit. -
The
git.push-branch-prefix
config has been deprecated in favor of
git.push-bookmark-prefix
. -
conflict()
andfile()
revsets have been renamed toconflicts()
andfiles()
respectively. The old names are still around and will be removed in a future
release.
New features
-
The new config option
snapshot.auto-track
lets you automatically track only
the specified paths (all paths by default). Use the newjj file track
command to manually tracks path that were not automatically tracked. There is
no way to list untracked files yet. Usegit status
in a colocated workspace
as a workaround.
#323 -
jj fix
now allows fixing unchanged files with the--include-unchanged-files
flag. This
can be used to more easily introduce automatic formatting changes in a new
commit separate from other changes. -
jj workspace add
now accepts a--sparse-patterns=<MODE>
option, which
allows control of the sparse patterns for a newly created workspace:copy
(inherit from parent; default),full
(full working copy), orempty
(the
empty working copy). -
New command
jj workspace rename
that can rename the current workspace. -
jj op log
gained an option to include operation diffs. -
jj git clone
now accepts a--remote <REMOTE NAME>
option, which
allows to set a name for the remote instead of using the default
origin
. -
jj op undo
now reports information on the operation that has been undone. -
jj squash
: the-k
flag can be used as a shorthand for--keep-emptied
. -
CommitId / ChangeId template types now support
.normal_hex()
. -
jj commit
andjj describe
now accept--author
option allowing to quickly change
author of given commit. -
jj diffedit
,jj abandon
, andjj restore
now accept a--restore-descendants
flag. When used, descendants of the edited or deleted commits will keep their original
content. -
jj git fetch -b <remote-git-branch-name>
will now warn if the branch(es)
can not be found in any of the specified/configured remotes. -
jj split
now lets the user select all changes in interactive mode. This may be used
to keeping all changes into the first commit while keeping the current commit
description for the second commit (the newly created empty one). -
Author and committer names are now yellow by default.
Fixed bugs
-
Update working copy before reporting changes. This prevents errors during reporting
from leaving the working copy in a stale state. -
Fixed panic when parsing invalid conflict markers of a particular form.
(#2611) -
Editing a hidden commit now makes it visible.
-
The
present()
revset now suppresses missing working copy error. For example,
present(@)
evaluates tonone()
if the current workspace has no
working-copy commit.
Contributors
Thanks to the people who made this release happen!
- Austin Seipp (@thoughtpolice)
- Danny Hooper (@hooper)
- Emily Shaffer (@nasamuffin)
- Essien Ita Essien (@essiene)
- Ethan Brierley (@eopb)
- Ilya Grigoriev (@ilyagr)
- Kevin Liao (@kevincliao)
- Lukas Wirth (@Veykril)
- Martin von Zweigbergk (@martinvonz)
- Mateusz Mikuła (@mati865)
- mlcui (@mlcui-corp)
- Philip Metzger (@PhilipMetzger)
- Samuel Tardieu (@samueltardieu)
- Stephen Jennings (@jennings)
- Tyler Goffinet (@qubitz)
- Vamsi Avula (@avamsi)
- Yuya Nishihara (@yuja)
v0.21.0
Breaking changes
next/prev
will no longer infer when to go into edit mode when moving from
commit to commit. It now either follows the flags--edit|--no-edit
or it
gets the mode fromui.movement.edit
.
Deprecations
jj untrack
has been renamed tojj file untrack
.
New features
-
Add new boolean config knob,
ui.movement.edit
for controlling the behaviour
ofprev/next
. The flag turnsedit
modeon
andoff
permanently when set
respectively totrue
orfalse
. -
All diff formats except
--name-only
now include information about copies and
moves. So do external diff tools in file-by-file mode.jj status
also
includes information about copies and moves. -
Color-words diff has gained an option to display complex changes as separate
lines. It's enabled by default. To
restore the old behavior, setdiff.color-words.max-inline-alternation = -1
. -
A tilde (
~
) at the start of the path will now be expanded to the user's home
directory when configuring asigning.key
for SSH commit signing. -
When reconfiguring the author, warn that the working copy won't be updated
Fixed bugs
- Release binaries for Intel Macs have been restored. They were previously
broken due to using a sunset version of GitHub's macOS runners (but nobody had
previously complained.)
Contributors
Thanks to the people who made this release happen!
- Aaron Bull Schaefer (@elasticdog)
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Raniz Daniel Raneland (@Raniz85)
- Daniel Ploch (@torquestomp)
- Essien Ita Essien (@essiene)
- Ilya Grigoriev (@ilyagr)
- Kaleb Pace (@kalebpace)
- Marie (@NyCodeGHG)
- Marijan Smetko (@InCogNiTo124)
- Martin von Zweigbergk (@martinvonz)
- Matt Kulukundis (@fowles)
- Scott Taylor (@scott2000)
- Stephen Jennings (@jennings)
- tingerrr (@tingerrr)
- Yuya Nishihara (@yuja)