Releases: jj-vcs/jj
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)
v0.20.0
Note to packagers
jj
now linkslibgit2
statically by default. To use dynamic linking, you
need to set the environment variableLIBGIT2_NO_VENDOR=1
while compiling.
(#4163)
Breaking changes
-
jj rebase --skip-empty
has been renamed tojj rebase --skip-emptied
-
jj backout --revision
has been renamed tojj backout --revisions
.
The short alias-r
is still supported. -
The default
immutable_heads()
set
now includesuntracked_remote_branches()
with the assumption that untracked
branches aren't managed by you. Therefore, untracked branches are no longer
displayed injj log
by default. -
Updated defaults for graph node symbol templates
templates.log_node
and
templates.op_log_node
. -
The "fileset" language is now enabled by default. It can
still be disable by settingui.allow-filesets=false
. -
On
jj git fetch
/import
, commits referred to byHEAD@git
are no longer
preserved. If a checked-out named branch gets deleted locally or remotely, the
corresponding commits will be abandoned. -
jj --at-op=@
no longer merges concurrent operations if explicitly specified. -
jj obslog -p
no longer shows diffs at non-partial squash operations.
Previously, it showed the same diffs as the second predecessor.
Deprecations
- The original configuration syntax for
jj fix
is now deprecated in favor of
one that allows defining multiple tools that can affect different filesets.
These can be used in combination for now. Seejj help fix
for details.
New features
-
External diff tools can now be configured to invoke the tool on each file
individually instead of being passed a directory by setting
merge-tools.$TOOL.diff-invocation-mode="file-by-file"
in config.toml. -
In git diffs, word-level hunks are now highlighted with underline. See diff
colors and styles for customization. -
New
.diff().<format>()
commit template methods are added. They can be used
in order to show diffs conditionally. For example,
if(current_working_copy, diff.summary())
. -
jj git clone
andjj git init
with an existing git repository adds the
default branch of the remote as repository settings for
revset-aliases."trunk()"
.` -
jj workspace forget
now abandons the workspace's working-copy commit if it
was empty. -
jj backout
now includes the backed out commit's subject in the new commit
message. -
jj backout
can now back out multiple commits at once. -
jj git clone some/nested/path
now creates the full directory tree for
nested destination paths if they don't exist. -
String patterns now support case‐insensitive matching by suffixing any
pattern kind with-i
.mine()
uses case‐insensitive matching on your email
address unconditionally. Only ASCII case folding is currently implemented,
but this will likely change in the future. -
String patterns now support
regex:"pattern"
. -
New
tracked_remote_branches()
anduntracked_remote_branches()
revset
functions can be used to select tracked/untracked remote branches. -
The
file()
revset function now accepts fileset as argument. -
New
diff_contains()
revset function can be used to search diffs. -
New command
jj operation diff
that can compare changes made between two
operations. -
New command
jj operation show
that can show the changes made in a single
operation. -
New config setting
git.private-commits
to prevent commits from being pushed. -
The default commit description template
can now be configured bytemplates.draft_commit_description
. -
jj fix
can now be configured to run different tools on different filesets.
This simplifies the use case of configuring code formatters for specific file
types. Seejj help fix
for details. -
Added revset functions
author_date
andcommitter_date
. -
jj describe
can now update the description of multiple commits.
Fixed bugs
-
jj status
will show different messages in a conflicted tree, depending
on the state of the working commit. In particular, if a child commit fixes
a conflict in the parent, this will be reflected in the hint provided
byjj status
-
jj diff --git
no longer shows the contents of binary files. -
Windows binaries no longer require
vcruntime140.dll
to be installed
(normally through Visual Studio.) -
On quit, the builtin pager no longer waits for all outputs to be discarded.
-
jj branch rename
no longer shows a warning in colocated repos.
Contributors
Thanks to the people who made this release happen!
- Anton Älgmyr (@algmyr)
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Daniel Ploch (@torquestomp)
- Danny Hooper (@hooper)
- Emily (@emilazy)
- Essien Ita Essien (@essiene)
- Erich Gubler (@ErichDonGubler)
- Fedor Sheremetyev (@sheremetyev)
- Ilya Grigoriev (@ilyagr)
- Jonathan Tan (@jonathantanmy)
- Julien Vincent (@julienvincent)
- Martin von Zweigbergk (@martinvonz)
- Matt Kulukundis (@fowles)
- Matt Stark (@matts1)
- mlcui (@mlcui-corp)
- Philip Metzger (@PhilipMetzger)
- Scott Taylor (@scott2000)
- Skyler Grey (@Minion3665)
- Stephen Jennings (@jennings)
- Tim Janik (@tim-janik)
- Vincent Ging Ho Yim (@cenviity)
- Vladimír Čunát (@vcunat)
- Vladimir (@0xdeafbeef)
- Yuya Nishihara (@yuja)
v0.19.0
Breaking changes
-
In revset aliases, top-level
kind:pattern
expression is now parsed as
modifier. Surround with parentheses if it should be parsed as string/file
pattern. -
Dropped support for automatic upgrade of repo formats used by versions before
0.12.0. -
jj fix
now defaults to the broader revset-s reachable(@, mutable())
instead of-s @
. -
Dropped support for deprecated
jj branch delete
/forget
--glob
option. -
jj branch set
now creates new branch if it doesn't exist. Usejj branch move
to ensure that the target branch already exists.
#3584
Deprecations
-
Replacing
-l
shorthand for--limit
with-n
injj log
,jj op log
andjj obslog
. -
jj split --siblings
is deprecated in favor ofjj split --parallel
(to
matchjj parallelize
). -
A new
jj file
subcommand now replaces several existing uncategorized
commands, which are deprecated.jj file show
replacesjj cat
.jj file chmod
replacesjj chmod
.jj file list
replacesjj files
.
New features
-
Support background filesystem monitoring via watchman triggers enabled with
thecore.watchman.register_snapshot_trigger = true
config. -
Show paths to config files when configuration errors occur.
-
jj fix
now supports configuring the default revset for-s
using the
revsets.fix
config. -
The
descendants()
revset function now accepts an optionaldepth
argument;
like theancestors()
depth argument, it limits the depth of the set. -
Revset/template aliases now support function overloading.
#2966 -
Conflicted files are individually simplified before being materialized.
-
The
jj file
subcommand now contains several existing file utilities.jj file show
, replacingjj cat
.jj file chmod
replacingjj chmod
.jj file list
replacingjj files
.
-
New command
jj branch move
let you update branches by name pattern or source
revision. -
New diff option
jj diff --name-only
allows for easier shell scripting. -
In color-words diffs, hunks are now highlighted with underline. See diff
colors and styles for customization. -
jj git push -c <arg>
can now accept revsets that resolve to multiple
revisions. This means thatjj git push -c xyz -c abc
is now equivalent to
jj git push -c 'all:(xyz | abc)'
. -
jj prev
andjj next
have gained a--conflict
flag which moves you
to the next conflict in a child commit. -
New command
jj git remote set-url
that sets the url of a git remote. -
Author timestamp is now reset when rewriting discardable commits (empty
commits with no description) if authored by the current user.
#2000 -
jj commit
now accepts--reset-author
option to matchjj describe
. -
jj squash
now accepts a--keep-emptied
option to keep the source commit.
Fixed bugs
-
jj git push
now ignores immutable commits when checking whether a
to-be-pushed commit has conflicts, or has no description / committer / author
set. #3029 -
jj
will look for divergent changes outside the short prefix set even if it
finds the change id inside the short prefix set.
#2476
Contributors
Thanks to the people who made this release happen!
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Daniel Ploch (@torquestomp)
- Danny Hooper (@hooper)
- Ilya Grigoriev (@ilyagr)
- James Sully (@sullyj3)
- Jonathan Tan (@jonathantanmy)
- Kyle J Strand (@BatmanAoD)
- Manuel Caldeira (@KiitoX)
- Martin von Zweigbergk (@martinvonz)
- Matt Kulukundis (@fowles)
- Matt Stark (@matts1)
- mlcui (@mlcui-corp)
- Philip Metzger (@PhilipMetzger)
- Scott Taylor (@scott2000)
- Simon Wollwage (@Kintaro)
- Tal Pressman (@tp-woven)
- Yuya Nishihara (@yuja)
v0.18.0
Breaking changes
-
Dropped support for
ui.default-revset
config (replaced byrevsets.log
in
0.8.0). -
The
commit_summary_no_branches
template is superseded by
templates.branch_list
. -
jj split
will now refuse to split an empty commit. -
jj config list
now uses multi-line strings and single-quoted strings in the
output when appropriate. -
jj config get
/list
/set
now parsename
argument as TOML
key. Quote meta characters as needed.
Example:jj config get "revset-aliases.'trunk()'"
-
When updating the working copy away from an empty and undescribed commit, it
is now abandoned even if it is a merge commit. -
If a new working-copy commit is created because the old one was abandoned, and
the old commit was merge, then the new commit will now also be.
#2859 -
jj new
's--insert-before
/--insert-after
options must now be set for each
commit the new commit will be inserted before/after. Previously, those options
were global flags and specifying them once would insert the new commit before/
after all the specified commits.
Deprecations
- Attempting to alias a built-in command now gives a warning, rather than being
silently ignored.
New features
-
jj branch list
/tag list
now accept-T
/--template
option. The tag list
prints commit summary along with the tag name by default. -
Conflict markers now include an explanation of what each part of the conflict
represents. -
ui.color = "debug"
prints active labels alongside the regular colored output. -
jj branch track
now show conflicts if there are some. -
A new revset
reachable(srcs, domain)
will return all commits that are
reachable fromsrcs
withindomain
. -
There are now prebuilt binaries for
aarch64-linux-unknown-musl
.
Note, these are cross compiled and currently untested.
We plan on providing fully tested builds later once our CI system allows it. -
Added new revsets
mutable()
andimmutable()
. -
Upgraded
scm-record
from v0.2.0 to v0.3.0. See release notes at
https://github.com/arxanas/scm-record/releases/tag/v0.3.0 -
New command
jj fix
that can be configured to update commits by running code
formatters (or similar tools) on changed files. The configuration schema and
flags are minimal for now, with a number of improvements planned (for example,
#3800 and
#3801). -
jj new
's--insert-before
and--insert-after
options can now be used
simultaneously. -
jj git push
now can push commits with empty descriptions with the
--allow-empty-description
flag
Fixed bugs
-
Previously,
jj git push
only made sure that the branch is in the expected
location on the remote server when pushing a branch forward (as opposed to
sideways or backwards). Now,jj git push
makes a safety check in all cases
and fails wheneverjj git fetch
would have introduced a conflict.In other words, previously branches that moved sideways or backward were
pushed similarly to Git'sgit push --force
; now they have protections
similar togit push --force-with-lease
(though not identical to it, to match
the behavior ofjj git fetch
). Note also that because of the wayjj git fetch
works,jj
does not suffer from the same problems as Git'sgit push --force-with-lease
in situations whengit fetch
is run in the background. -
When the working copy commit becomes immutable, a new one is automatically created
on top of it to avoid letting the user edit the immutable one. -
jj config list
now properly escapes TOML keys (#1322). -
Files with conflicts are now checked out as executable if all sides of the
conflict are executable. -
The progress bar (visible when using e.g.
jj git clone
) clears the
remainder of the cursor row after drawing rather than clearing the entire row
before drawing, eliminating the "flicker" effect seen on some terminals.
Contributors
Thanks to the people who made this release happen!
- Alexander Potashev (@aspotashev)
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Charles Crete (@Cretezy)
- Daniel Ploch (@torquestomp)
- Danny Hooper (@hooper)
- Eidolon (@HybridEidolon)
- Glen Choo (@chooglen)
- Gregory Anders (@gpanders)
- Ilya Grigoriev (@ilyagr)
- jyn (@jyn514)
- Martin von Zweigbergk (@martinvonz)
- Matt Stark (@matts1)
- Matthew Davidson (@KingMob)
- Michael Gattozzi (@mgattozzi)
- mlcui (@mlcui-corp)
- Philip Metzger (@PhilipMetzger)
- Remo Senekowitsch (@senekor)
- Thomas Castiglione (@gulbanana)
- Théo Daron (@tdaron)
- tinger (@tingerrr)
- Waleed Khan (@arxanas)
- Yuya Nishihara (@yuja)
v0.17.1
Fixed bugs
jj status
no longer scans through the entire history to look for ancestors with conflicts.
v0.17.0
Breaking changes
-
The default template aliases were replaced as follows:
builtin_op_log_root(op_id: OperationId)
->
format_root_operation(root: Operation)
builtin_log_root(change_id: ChangeId, commit_id: CommitId)
->
format_root_commit(root: Commit)
builtin_change_id_with_hidden_and_divergent_info
->
format_short_change_id_with_hidden_and_divergent_info(commit: Commit)
-
The
--revision
option ofjj rebase
is renamed to--revisions
. The short
alias-r
is still supported.
New features
-
The list of conflicted paths is printed whenever the working copy changes.
This can be disabled with the--quiet
option. -
Commit objects in templates now have a
mine() -> Boolean
method analog to
the same function in revsets. It evaluates to true if the email of the commit
author matches the currentuser.email
. -
Commit objects in templates now have a
contained_in(revset: String) -> Boolean
method. -
Operation objects in templates now have a
snapshot() -> Boolean
method that
evaluates to true if the operation was a snapshot created by a non-mutating
command (e.g.jj log
). -
Revsets and templates now support single-quoted raw string literals.
-
A new config option
ui.always-allow-large-revsets
has been added to
allow large revsets expressions in some commands, without theall:
prefix. -
A new config option
ui.allow-filesets
has been added to enable "fileset"
expressions. Note that filesets are currently experimental,
but will be enabled by default in a future release. -
A new global flag
--ignore-immutable
lets you rewrite immutable commits. -
New command
jj parallelize
that rebases a set of revisions into siblings. -
jj status
now supports filtering by paths. For example,jj status .
will
only list changed files that are descendants of the current directory. -
jj prev
andjj next
now work when the working copy revision is a merge. -
jj squash
now accepts a--use-destination-message/-u
option that uses the
description of the destination for the new squashed revision and discards the
descriptions of the source revisions. -
You can check whether Watchman fsmonitor is enabled or installed with the new
jj debug watchman status
command. -
jj rebase
now accepts revsets resolving to multiple revisions with the
--revisions
/-r
option. -
jj rebase -r
now accepts--insert-after
and--insert-before
options to
customize the location of the rebased revisions.
Fixed bugs
-
Revsets now support
\
-escapes in string literal. -
The builtin diff editor now allows empty files to be selected during
jj split
. -
Fixed a bug with
jj split
introduced in 0.16.0 that caused it to incorrectly
rebase the children of the revision being split if they had other parents
(i.e. if the child was a merge). -
The
snapshot.max-new-file-size
option can now handle raw integer literals,
interpreted as a number of bytes, where previously it could only handle string
literals. This means thatsnapshot.max-new-file-size="1"
and
snapshot.max-new-file-size=1
are now equivalent. -
jj squash <path>
is now a no-op if the path argument didn't match any paths
(it used to create new commits with bumped timestamp).
#3334
Contributors
Thanks to the people who made this release happen!
- Anton Älgmyr (@algmyr)
- Anton Bulakh (@necauqua)
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Cretezy (@Cretezy)
- Daniel Ploch (@torquestomp)
- Evan Mesterhazy (@emesterhazy)
- Ilya Grigoriev (@ilyagr)
- Martin von Zweigbergk (@martinvonz)
- Noah Mayr (@noahmayr)
- Jeremy O'Brien (@neutralinsomniac)
- Jonathan Lorimer (@JonathanLorimer)
- Philip Metzger (@PhilipMetzger)
- Poliorcetics (@poliorcetics)
- Rowan Walsh (@rowan-walsh)
- Scott Olson (@solson)
- Théo Daron (@Kaporos)
- Yuya Nishihara (@yuja)
v0.16.0
Deprecations
jj move
was deprecated in favor ofjj squash
.
Breaking changes
-
The
git_head
template keyword now returns an optional value instead of a
list of 0 or 1 element. -
The
jj sparse set --edit
/--reset
flags were split up intojj sparse edit
/reset
subcommands respectively. -
The
jj sparse
subcommands now parse and print patterns as workspace-relative
paths. -
The
jj log
command no longer uses the default revset when a path is specified.
New features
-
Config now supports rgb hex colors (in the form
#rrggbb
) wherever existing color names are supported. -
ui.default-command
now accepts multiple string arguments, for more complex
defaultjj
commands. -
Graph node symbols are now configurable via templates
templates.log_node
templates.op_log_node
-
jj log
now includes synthetic nodes in the graph where some revisions were
elided. -
jj squash
now accepts--from
and--into
(also aliased as--to
) if-r
is not specified. It can now be used for all use cases wherejj move
could
previously be used. The--from
argument accepts a revset that resolves to
more than one revision. -
Commit templates now support
immutable
keyword. -
New template function
coalesce(content, ..)
is added. -
Timestamps are now shown in local timezone and without milliseconds and
timezone offset by default. -
jj git push
now prints messages from the remote. -
jj branch list
now supports a--conflicted/-c
option to show only conflicted branches. -
jj duplicate
andjj abandon
can now take more than a single-r
argument,
for consistency with other commands. -
jj branch list
now allows combining-r REVISIONS
/NAMES
and-a
options. -
--all
is now named--all-remotes
forjj branch list
-
There is a new global
--quiet
flag to silence commands' non-primary output. -
jj split
now supports a--siblings/-s
option that splits the target
revision into siblings with the same parents and children. -
new function
working_copies()
for revsets to show the working copy commits of all workspaces.
Fixed bugs
None.
Contributors
Thanks to the people who made this release happen!
- Aleksey Kuznetsov (@zummenix)
- Anton Älgmyr (@algmyr)
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Chris Krycho (@chriskrycho)
- Christoph Koehler (@ckoehler)
- Daniel Ploch (@torquestomp)
- Evan Mesterhazy (@emesterhazy)
- Ilya Grigoriev (@ilyagr)
- Khionu Sybiern (@khionu)
- Martin von Zweigbergk (@martinvonz)
- Matthew Davidson (@KingMob)
- mrstanwell (@mrstanwell)
- Noah Mayr (@noahmayr)
- Patric Stout (@TrueBrain)
- Poliorcetics (@poliorcetics)
- Simon Wollwage (@Kintaro)
- Steve Klabnik (@steveklabnik)
- Tom Ward (@tomafro)
- TrashCan (@TrashCan69420)
- Yuya Nishihara (@yuja)