Aquí hi ha 36 versions de jj, des de 22 de febrer del 2025 fins a l’actual, 0.46.0. Cadascuna enllaça amb els instal·ladors del mateix desenvolupador.
36 versions en 2 anys · unes 17 per any
| Versió | Data | Mida | Fitxers |
|---|---|---|---|
| 0.46.0Darrera versió | 7 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióAbout
jj is a Git-compatible version control system that is both simple and powerful. See
the installation instructions to get started.
Release highlights
- Jujutsu can now colocate workspaces besides the default one by creating Git
worktrees. Use jj workspace add --[no-]colocate and the setting
git.colocate to control this.
Breaking changes
- The minimum supported git command version is now 2.42.0, up from 2.41.0.
jj workspace add uses git worktree add --orphan, which was added in
2.42.0.
- The minimum supported Rust version (MSRV) is now 1.97.1.
- jj bisect run now runs some consistency checks before proceeding to bisect.
This helps ensure that the command can tell good and bad revisions apart,
and that the working copy does go from bad to good over the provided revset.
Use the new flag --trust-endpoints to disable these checks.
- jj split now opens a single editor session to edit descriptions for the
split commits.
- jj undo and jj redo now refuse to undo/redo an operation that was
performed in another workspace. Use --allow-cross-workspace to undo/redo
it anyway.
- jj workspace list/root no longer omit unreachable paths. All recorded
paths are now shown, with warnings displayed in jj workspace root.
- The List.get(), .first(), and .last() template functions now return
Option<T> instead of throwing an error on out-of-bounds access.
New features
- jj workspace add supports --colocate/--no-colocate flags to control
whether a Git worktree is created alongside the workspace. The default
colocates when the current workspace is colocated and the git.colocate
config is true. jj workspace forget removes the corresponding Git
worktree when one exists.
- jj git colocation status/enable/disable now work on child
workspaces. status correctly reports colocation state and includes
the workspace name. enable creates a Git worktree and disable
removes it, allowing colocation to be toggled after workspace
creation.
- jj workspace remove removes a workspace and its directory from disk. The
working-copy state is snapshotted into a commit before removal.
- Added commands jj file edit and jj file delete for editing files in any
revision without needing to change the working copy.
- jj git push now supports pushing to multiple remotes at the same time.
This can be configured via git.push set to a string pattern
or array of string patterns, or with the repeatable --remote flag,
which also accepts string patterns.
- The default target revisions for jj git push can now be configured via
revsets.git-push.
- Added the TreeEntry.normal_value() template method and the TreeValue type
to access resolved tree values, formatted as their full object IDs, including
Git submodule commit IDs.
- Diff hunk headers now include nearby source symbols for many common
programming and markup languages.
- fix.tools.<name>.line-range-args (replaces line-range-arg) is an array of
string template args to pass to the fix tool. This is more flexible in cases
where you need to pass multiple arguments to the tool, such as separate args
for the range start and range end.
- jj run now uses the sparse patterns from the workspace it's run from.
Use the --sparse-patterns option to control this behavior (evaluated
per each jj run invocation).
- jj util diff <path1> <path2> to compare files on disk.
- Aliases now support setting aliases.<name>.enabled = false, which will
disable them. This can be used to disable built-in aliases or disable aliases
in later layers (such as repo config files).
- ui.editor now supports $path and $line substitution variables. Example:
ui.editor = ["emacs", "+$line", "$path"]
- fill template function now supports an additional named parameter
break_words, that allows specifying if the template should break words
longer than width passed in the input to ensure no words overflow the
specified width.
- The json() template function now supports map literals: json({'key' => value})
- The hunk headers of diff.color-words.conflict = "pair" now include the
co |
| 0.45.1 | 3 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióAbout
jj is a Git-compatible version control system that is both simple and powerful. See
the installation instructions to get started.
Release highlights
This release fixes an error that prevented the new jj-core crate from being
published. See the release notes for v0.45.0 for more changes since v0.44.0.
Fixed bugs
- Building without Cargo.lock (e.g. cargo install jj-cli) works again
after all versions of the bisync crate, a transitive dependency of gix,
were yanked.
- Signatures on commits in SHA-256 Git repositories are now stored under the
gpgsig-sha256 header, as Git does, so Git recognizes them as signed and
jj can read them back.
Contributors
Thanks to the people who made this release happen! This list includes the contributors to v0.45.0.
- Aaron Bies (@slerpyyy)
- aaronabbott (@aabmass)
- Alexander Chen (@alexuser)
- Austin Seipp (@thoughtpolice)
- Baptiste Girardeau (@baptiste0928)
- Caleb White (@calebdw)
- Daniel Danner (@dnnr)
- David Rieber (@drieber)
- Gaëtan Lehmann (@glehmann)
- Gasper Stukelj (@mirkomartn)
- hexbinoct (@hexbinoct)
- Joseph Lou (@josephlou5)
- Keane Nguyen (@keanemind)
- LOG (@logarithmone1128)
- Martin von Zweigbergk (@martinvonz)
- OlshaMB (@OlshaMB)
- Philip Metzger (@PhilipMetzger)
- Priyanka Mandloi (@pmandloi28)
- Remo Senekowitsch (@senekor)
- Riccardo Mazzarini (@noib3)
- Scott Sudharsan (@scott2000)
- sofia (@badp)
- Stephen Jennings (@jennings)
- Vaghinak Vardanyan (@vaghinak-vardanyan)
- Vincent Ging Ho Yim (@cenviity)
- Wang Yuantao (@0WD0)
- Yuya Nishihara (@yuja) |
| 0.45.0 | 3 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióAbout
jj is a Git-compatible version control system that is both simple and powerful. See
the installation instructions to get started.
Release highlights
- A new jj converge command was added to help automatically resolve divergent
commits by combining them appropriately.
Breaking changes
- jj config {edit,set,unset} --user now targets the first loaded user
configuration file (e.g. ~/.config/jj/config.toml or the first file in
conf.d/) instead of prompting interactively when multiple files exist.
Use --file <PATH> to target a specific config file.
- jj git import in non-colocated repositories no longer imports commits from a
detached Git HEAD branch.
Deprecations
None
New features
- The new jj converge command attempts to automatically resolve divergence by
creating a new commit that replaces the divergent commits. It applies
heuristics to try to automatically come up with a good solution, and falls
back to prompting the user if the heuristics are inconclusive. It can also run
in non-interactive mode, which aborts if prompting would be needed.
- jj bisect will now mention when it cannot unambiguously find the first bad
revision due to skips in evaluation.
- Git HEAD state is now tracked per worktree internally. This prepares
colocated repositories for support of multiple Git worktrees, where each
jj workspace can have its own Git HEAD. Existing repositories are migrated
automatically.
- jj config {edit,set,unset} now support a --file <PATH> option to
target a specific configuration file (such as files inside a conf.d/
directory or loaded via --config-file). This allows precise file targeting
and avoids interactive prompts when multiple config files exist.
Fixed bugs
- The default immutable_heads() set
now includes untracked_remote_tags().
- jj arrange now scrolls the viewport to keep the selected commit visible
when the commit stack is taller than the terminal.
#9033.
- The default pager flags now include -K (--quit-on-intr), so pressing
Ctrl+C in less exits cleanly instead of leaving the terminal in a
corrupted state (raw mode, visible escape sequences, broken input).
- A side of a conflict whose contents end with a carriage return no longer loses
that byte when the materialized conflict is parsed back, such as when a
conflicted file is snapshotted from the working copy.
#9868
- In colocated workspaces, jj workspace update-stale now correctly resets the
Git HEAD to the parent of the fresh working-copy commit.
#9936
- jj run no longer runs against the remaining revisions if a process exits
with a nonzero exit code.
- Fixed crash in jj log involving hidden revisions and the
log-graph-prioritize revset.
#9975
- In colocated repos, an external git add after a jj command no longer
produces a tree with duplicate entries (git fsck: duplicateEntries). jj
was leaving a stale cache-tree behind in .git/index. Repositories already
corrupted this way are not repaired by the fix.
#9711
#8884
Contributors
Thanks to the people who made this release happen!
- Aaron Bies (@slerpyyy)
- aaronabbott (@aabmass)
- Alexander Chen (@alexuser)
- Austin Seipp (@thoughtpolice)
- Baptiste Girardeau (@baptiste0928)
- Caleb White (@calebdw)
- Daniel Danner (@dnnr)
- David Rieber (@drieber)
- Gaëtan Lehmann (@glehmann)
- Gasper Stukelj (@mirkomartn)
- hexbinoct (@hexbinoct)
- Joseph Lou (@josephlou5)
- Keane Nguyen (@keanemind)
- LOG (@logarithmone1128)
- Martin von Zweigbergk (@martinvonz)
- OlshaMB (@OlshaMB)
- Philip Metzger (@PhilipMetzger)
- Priyanka Mandloi
- Remo Senekowitsch (@senekor)
- Riccardo Mazzarini (@noib3)
- Scott Sudharsan (@scott2000)
- sofia (@badp)
- Stephen Jennings (@jennings)
- Vaghinak Vardanyan (@vaghinak-vardanyan)
- Vincent Ging Ho Yim (@cenviity)
- Wang Yuantao (@0WD0)
- Yuya Nishihara (@yuja) |
| 0.44.0 | 6 d’agost del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióAbout
jj is a Git-compatible version control system that is both simple and powerful. See
the installation instructions to get started.
Release highlights
- Support for fetching and pushing tags has now been stabilized. Tags can be
tracked or untracked just like bookmarks. Tracked tags are pushed by default.
Breaking changes
- jj git fetch now fetches tags the same way it fetches bookmarks. Tags are
fetched as <name>@<remote>, and these remote tags are automatically tracked
by local tags of the same name. Running jj git fetch in an existing
repository will re-fetch all tags to initialize the tracking state.
Git's tagOpt is no longer respected. To disable tag fetching, set
remotes.<name>.fetch-tags = '~*' in the jj configuration.
- jj git clone --fetch-tags=all|none|included is removed in favor of
--tag=PATTERN.
- jj git push --all now pushes all tags in addition to bookmarks.
- The WorkspaceRef.root() and RepoPath.absolute() template functions now
return Option<FsPath> and FsPath respectively, instead of String. The
path keyword in jj config list templates now returns Option<FsPath>.
- jj file search now prints every matched line prefixed by the file path,
instead of only the file paths of files containing a match. Use
--name-only for the previous behavior.
#9399
- Passing an argument more than once is no longer an error. The last occurrence
wins, so jj --no-pager --no-pager version and jj log -n 5 -n 10 now work,
and an argument baked into an alias or a wrapper can be given explicitly as
well. Arguments that can be specified multiple times, such as --config and
jj log -r, are unaffected and still collect all of their values.
#8101
#9859
Deprecations
None
New features
- New merge_point() revset function which (similar to fork_point) finds the
point where multiple branches merge.
- jj workspace list now shows workspace roots by default. The output can be
customized with templates.workspace_list or -T, and WorkspaceRef.root()
returns an optional FsPath value.
#9713,
#9826
- New try(expr, fallback...) template function to suppress runtime errors.
- jj run now processes revisions from oldest to newest by default. The start
order is guaranteed: each revision begins execution only after the previous
one has started, even with --jobs higher than 1.
- jj run gained a --passthrough flag that connects the subprocess's
stdout/stderr directly to the terminal instead of capturing output.
- jj run gained a --ignore-changes flag to avoid editing any revisions even
if the command modifies the working copy.
- jj run gained a --ignore-errors flag to continue running against the
remaining revisions even if the command exits with a nonzero exit code.
- jj file search now supports -n/--line-number to prefix each match with
its 1-based line number within the file.
- jj git push gained a --allow-conflicts flag to allow pushing commits
containing conflicts.
- New jj tag track/untrack commands to associate local tags with remotes.
Note that fetched tags are tracked by default.
- Added builtin_log() revset alias for the built-in default jj log revset.
revsets.log now defaults to builtin_log(), so custom log revsets can
reuse the built-in default instead of copying its full expression.
- Added config option diff.stat.max-bar-width for use with --stat to limit
the ++-- bar width. In the templating language, diff.stat() can optionally
take a second (positional or named) argument max_bar_width for an equivalent
effect.
- jj absorb now supports --interactive/-i/--tool to let you
interactively choose which hunks from the source to consider for absorption.
This is useful when you only want to absorb part of a commit without first
splitting it. Any hunks that are not selected or cannot be absorbed remain in
the source commit.
Fixed bugs
- Recursive alias definitions are detected more precisely. jj can now expand
aliases that are simply repeated. For example, with the alias jj = [], the
command jj jj jj will resolve to jj. Aliases can also fall back to the |
| 0.43.0 | 2 de juliol del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versió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 run allows you to run a command over a set of changes, each with their
own private working copy; the commands may update the working copy and
changes/conflicts are propagated accordingly, e.g., jj run -- cargo check --all-features or jj run -- cargo fix behaves as one might expect.
Breaking changes
- The deprecated git_head() and git_refs() functions have been removed from
revsets and templates.
- Git-like symbols (e.g. refs/heads/main) are no longer resolved to
revisions. Use the bookmark/tag <name> or <name>@<remote> syntax instead.
- The deprecated ui.revsets-use-glob-by-default option has been removed.
- jj bookmark track/untrack no longer supports <kind>:<bookmark>@<remote>
patterns. However, the <bookmark>@<remote> symbol syntax is still supported.
#9226
Deprecations
New features
- jj show now supports --reversed flag.
- jj now looks for config files in /etc/jj.
- jj config gc will delete configuration of deleted/moved repos from
~/.config/jj/repos folder.
#9362
- jj run allows you to run a command over a set of changes, each with their
own private working copy; the commands may update the working copy and
changes/conflicts are propagated accordingly, e.g., jj run -- cargo check --all-features or jj run -- cargo fix behaves as one might expect.
- jj gerrit upload now supports the -o (--option) flag, which works like
git push -o (--push-option).
- jj git fetch now rebases the descendants of revisions that were rewritten
based on their change IDs. Previously, when multiple bookmarked revisions
existed in a stack, those rewritten revisions and their descendants wouldn't
always be rebased. Note that immutable descendants will not be rebased.
- Add a forks() revset function that yields all commits with more than 1 child.
- colors config now supports crossed-out text styling with
{ crossed-out = true }.
Fixed bugs
- On Windows, querying a path's file identity no longer follows symbolic links,
matching the behavior on Unix. Previously a symlink shared the identity of its
target, so two symlinks pointing at the same target were treated as the same
file. This identity check is used when writing the working copy to detect
aliases of the reserved .git and .jj directories.
#8924
- jj now creates a new working-copy revision during snapshotting if the
working copy was immutable. Previously, the new revision was created
immediately after the working copy became immutable.
#7751
#9338
- jj git remote add now warns if the new remote exactly matches an existing
remote's fetch URL or effective push URL.
#413
- Fixed corrupt loose Git objects on Intel Raptor Lake CPU and aarch64.
Previously, jj could report a successful commit even though git fsck would
later fail with incorrect data check, corrupt loose object, or missing blob, and later jj operations could fail with corrupt deflate stream.
Contributors
Thanks to the people who made this release happen!
- adlerd (@adlerd)
- ase (@adamse)
- Atakan Yenel (@atakanyenel)
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- David Rieber (@drieber)
- figsoda (@figsoda)
- Gaëtan Lehmann (@glehmann)
- hexbinoct (@hexbinoct)
- Jakub Stasiak (@jstasiak)
- Jonas Carpay (@jonascarpay)
- Joseph Lou (@josephlou5)
- Josh McKinney (@joshka)
- Josh Steadmon (@steadmon)
- Martin von Zweigbergk (@martinvonz)
- Matt Stark (@matts1)
- Philip Metzger (@PhilipMetzger)
- shoce (@shoce)
- Stephen Jennings (@jennings)
- Thomas Axelsson (@thomas-2nd)
- Vincent Ging Ho Yim (@cenviity)
- Yuya Nishihara (@yuja) |
| 0.42.0 | 4 de juny del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióAbout
jj is a Git-compatible version control system that is both simple and powerful. See
the installation instructions to get started.
Release highlights
- Switched to the mimalloc memory allocator for better multi-threaded
performance.
Breaking changes
- The following deprecated command options have been removed:
- jj commit --reset-author/--author
- jj describe --no-edit/--edit/--reset-author/--author
- jj git push --allow-new
- jj metaedit --update-committer-timestamp
- The following deprecated config options have been removed:
- git.auto-local-bookmark
- git.push-new-bookmarks
Deprecations
- jj evolog no longer supports legacy commit predecessors recorded in jj <
0.30.
New features
- Shell completions now surface descriptions for custom aliases,
revset-aliases, template-aliases, and fileset-aliases. Descriptions are
extracted from the .doc field of the alias definition if it is a table
with .doc and .definition properties.
- jj show now accepts multiple revisions, showing all of them one after the
other, behaving closer to git show.
- jj git fetch now generates evolution history based on change IDs. If change
IDs are preserved by the remote, local descendant revisions will be rebased
onto the rewritten parents.
- Added jj util backend name command that prints the commit backend being used
in the current repo.
- Added edit-invocation-mode config option for diff editors (e.g.
jj diffedit, jj split). When set to "file-by-file", the editor is
launched once per changed file, making it possible to use per-file tools like
vimdiff for editing.
Fixed bugs
- jj git remote add now reports an error instead of panicking when the
remote name is empty or contains whitespace.
#9099
- Color-words diffs are now shown as separate before and after lines when color
output is disabled, making piped or redirected diffs readable.
#5894
- jj bookmark forget no longer prints Forgot N local bookmarks. when no
local bookmarks were actually forgotten (e.g. when only an untracked remote
bookmark matched). #9181.
- The builtin_log_redacted template now also redacts workspace names.
Contributors
Thanks to the people who made this release happen!
- Alex Jaspersen (@ajaspers)
- Archer (@archer-321)
- ase (@adamse)
- Austin Seipp (@thoughtpolice)
- David Rieber (@drieber)
- Eyüp Can Akman (@eyupcanakman)
- Jakub Stasiak (@jstasiak)
- James Dixon (@lemonase)
- Joseph Lou (@josephlou5)
- Laurynas Keturakis (@laulauland)
- Luna Schwalbe (@lunagl)
- Martin von Zweigbergk (@martinvonz)
- Niko Savola (@nikosavola)
- OlshaMB (@OlshaMB)
- Sergey Kasmy (@SergeyKasmy)
- truffle (@truffle-dev)
- Vincent Ging Ho Yim (@cenviity)
- Yuya Nishihara (@yuja) |
| 0.41.0 | 7 de maig del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versió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 fix now supports formatting specific line ranges (allowing you to format
only modified lines); see the configuration manual and notes below for more.
- The new global flag --no-integrate-operation will let you run a command without
impacting the repo state or the working copy, which is useful when automated tools
may create snapshots in the background.
Breaking changes
- The --pattern flag for file search now defaults to regex: instead of glob:.
- jj git push --all/--tracked/-r REVSETS no longer fails when revisions to
push are private or have conflicts. Bookmarks which aren't eligible to push
will be skipped.
- Branch/bookmark patterns passed to jj git clone are now saved to jj's repo
settings file instead of .git/config. Git fetch refspecs are set to the
default value.
Deprecations
- In the templating language, the Operation type's .tags() function has been
deprecated in favor of .attributes().
New features
- The --pattern flag for file search now accepts various pattern kinds through
kind:pattern syntax.
- A new global flag --no-integrate-operation lets you run a command without
impacting the repo state or the working copy.
- A new config option diff.git.show-path-prefix can be used to suppress the
a/ and b/ path prefixes in the diff --git output.
- jj fix now supports line range-limited formatting via the fix.tools.<name>.line-range-arg
and run-tool-if-zero-line-ranges configs. This allows running tools only on modified
lines and fine-grained control over when the tool is run. If you have set the line-range-arg
config, use --all-lines to match the previous behavior of formatting the entire file.
- A new replace(pattern, content, replacement) template function is added
which supports replacement of content in templates, using a lambda to format
replacement text. It supports all string patterns, including regexes with
capture groups (e.g. replace(regex:'(\w+) (\w+)', "hello world", |c| c.get(1) ++ " " ++ c.get(2))).
- New ByteString template type for things like file content.
- jj gerrit upload now supports the new options --message (-m), --edit
and --merged. You can now also pass multiple hashtags by repeating the
--hashtag option.
- New remotes.<name>.fetch-bookmarks/fetch-tags options to configure
default fetch targets.
- JJ_PAGER can now override the ui.pager config, matching JJ_EDITOR for
callers that need a jj-specific environment override.
Fixed bugs
- Improving consistency with git handling of .gitignore, including /
after entries and \r\r\n for MacOS files.
- jj status filters untracked paths by fileset
#9287
- Improved performance for snapshotting, visibly improving jj status
speed for large repositories.
- Pre-existing Git submodule directories are no longer considered conflicts in
checkouts. #8065.
- Fixed a panic in jj gerrit upload when run without -r and the
inferred revision was immutable. #9398
- jj status respects path filters in working copy summaries.
- jj git remote rename/remove now updates the trunk() alias.
- Commands would sometimes incorrectly diagnose a stale working copy and suggest
running jj op integrate when it would have no effect. This should now be
much less likely to happen in practice.
#9314
Contributors
Thanks to the people who made this release happen!
- Adrian Freund (@freundTech)
- ase (@adamse)
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Björn Kautler (@Vampire)
- David Higgs (@higgsd)
- David Rieber (@drieber)
- dzaima (@dzaima)
- Federico G. Schwindt (@fgsch)
- Gaëtan Lehmann (@glehmann)
- hewigovens (@hewigovens)
- Ilya Grigoriev (@ilyagr)
- jonmeow (@jonmeow)
- Joseph Lou (@josephlou5)
- Josh McKinney (@joshka)
- Jun Mukai (@jmuk)
- Lucas Garron (@lgarron)
- Martin von Zweigbergk (@martinvonz)
- Matt Stark (@matts1)
- Maximilian Gaß (@mxey)
- OlshaMB (@OlshaMB)
- Philip Metzger (@PhilipMetzger)
- rayaq
- Re |
| 0.40.0 | 2 d’abril del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióAbout
jj is a Git-compatible version control system that is both simple and powerful. See
the installation instructions to get started.
Release highlights
None
Breaking changes
None
Deprecations
None
New features
- New diff_lines_added() and diff_lines_removed() revset functions for
matching content on only one side of a diff.
- The end parameter in the String.substr(start, end) templating method is
now optional. If not given, substr() returns from start to the end of the
string.
- WorkspaceRef templates now provide a .root() method to show the absolute
path to each workspace root.
- The jj arrange TUI now includes immediate parents and children. They are not
selectable and are dimmed by default.
- jj arrange uses the default log template (builtin_log_compact) instead of
the shorter commit summary style.
- In the jj arrange TUI, the "swap up/down" actions now move along graph edges
even if the commit rows are not adjacent.
- Diff colors can now be configured
differently for each format.
- jj op log now includes the name of the workspace the operation was created
from.
- The config() template function now accepts a Stringify expression instead
of LiteralString. This allows looking up configuration values dynamically.
- jj op show, jj op diff, jj op log -p now only show "interesting"
revisions by default (defined by revsets.op-diff-changes-in). A new flag,
--show-changes-in, can be used to override this. #6083
Fixed bugs
- .gitignore with UTF-8 BOM can now be parsed correctly.
- Fix incompatibility with gpgsm 2.5.x.
Contributors
Thanks to the people who made this release happen!
- Aaron Sutton (@aaronjsutton)
- Adam Sandberg Eriksson (@adamse)
- Anton Älgmyr (@algmyr)
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Ben Warren (@warrenbhw)
- Bryant Chandler (@brychanrobot)
- David Higgs (@higgsd)
- Filip Weiss (@fiws)
- Gabriel Goller (@kaffarell)
- Gaëtan Lehmann (@glehmann)
- Ilya Grigoriev (@ilyagr)
- Jeff Turner (@jefft)
- Joseph Lou (@josephlou5)
- Josh Steadmon (@steadmon)
- KITAGAWA Yasutaka (@kit494way)
- Liam (@terror)
- Li-Wen Hsu (@lwhsu)
- Martin von Zweigbergk (@martinvonz)
- Philip Metzger (@PhilipMetzger)
- Poliorcetics (@poliorcetics)
- Remo Senekowitsch (@senekor)
- Rob Pilling (@bobrippling)
- Scott Taylor (@scott2000)
- Shnatu
- Stephen Prater (@stephenprater)
- Yuya Nishihara (@yuja)
- Zeyi Fan (@fanzeyi) |
| 0.39.0 | 4 de març del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versió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 arrange command brings up a TUI where you can reorder and abandon
revisions. #1531
- jj bookmark advance automatically moves bookmarks forward to a
target revision (defaults to @) using customization points
revsets.bookmark-advance-from and revsets.bookmark-advance-to.
It is heavily inspired by the longstanding community alias jj tug.
Breaking changes
- Dropped support for legacy index files written by jj < 0.33. New index files
will be created as needed.
- The following deprecated config options have been removed:
- core.fsmonitor
- core.watchman.register-snapshot-trigger
- The deprecated command jj op undo has been removed. Use jj op revert or
jj undo/redo instead.
Deprecations
- jj debug snapshot is deprecated in favor of jj util snapshot. Although
this was an undocumented command in the first place, it will be removed after
6 months (v0.45.0) to give people time to migrate away.
New features
- Add support for push options in jj git push with the --option flag.
This allows users to pass options to the remote server when pushing commits.
The short alias -o is also supported.
- jj new now evaluates the new_description template to populate the
initial commit description when no -m message is provided.
- Templates now support first(), last(), get(index), reverse(),
skip(count), and take(count) methods on list types for more flexible
list manipulation.
- New builtin_draft_commit_description_with_diff template that includes the
diff in the commit description editor, making it easier to review changes
while writing commit messages.
- Revsets and templates now support name:x pattern aliases such as 'grep:x' = 'description(regex:x)'.
- Filesets now support user aliases.
- jj workspace add now links with relative paths. This enables workspaces to work
inside containers or when moved together. Existing workspaces with absolute paths
will continue to work as before.
- jj undo now also outputs what operation was undone, in addition to the
operation restored to.
- Bookmarks with two or more consecutive - characters no longer need to be quoted
in revsets. For example, jj diff -r '"foo--bar"' can now be written as jj diff -r foo--bar.
- New flag --simplify-parents on jj rebase to apply the same transformation
as jj simplify-parents on the rebased commits.
#7711
- jj rebase --branch and jj rebase --source will no longer return an error
if the given argument resolves to an empty revision set
(jj rebase --revisions already behaved this way). Instead, a message will be
printed to inform the user why nothing has changed.
- Changed Git representation of conflicted commits to include files from the
first side of the conflict. This should prevent unchanged files from being
highlighted as "added" in editors when checking out a conflicted commit in a
colocated workspace.
- New template function Timestamp::since(ts) that returns the TimestampRange
between two timestamps. It can be used in conjunction with .duration() in
order to obtain a human-friendly duration between two Timestamps.
- Added new jj util snapshot command to manually or programmatically trigger a
snapshot. This introduces an official alternative to the
previously-undocumented jj debug snapshot command. The Watchman integration
has also been updated to use this command instead.
- Changed background snapshotting to suppress stdout and stderr to avoid long
hangs.
- jj gerrit upload now supports a variety of new flags documented in
gerrit's documentation.
This includes, for example, --reviewer=foo@example.com and
--label=Auto-Submit.
- jj gerrit upload now recognizes Change-Id explicitly set via the alternative
trailer Link, and will generate a Link: <review-url>/id/<change-id> trailer
if gerrit.review-url option is set.
- jj gerrit upload no longer requires the -r flag, and will default to
uploading what you're currently working o |
| 0.38.0 | 5 de febrer del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióAbout
jj is a Git-compatible version control system that is both simple and powerful. See
the installation instructions to get started.
Release highlights
- Per-repo and per-workspace config is now stored outside the repo, for security
reasons. This is not a breaking change because we automatically migrate
legacy repos to this new format. .jj/repo/config.toml and
.jj/workspace-config.toml should no longer be used.
Breaking changes
- The minimum supported git command version is now 2.41.0. macOS users will
need to either upgrade "Developer Tools" to 26 or install Git from
e.g. Homebrew.
- Deprecated ui.always-allow-large-revsets setting and all: revset modifier
have been removed.
- <name>@<remote> revset symbols can also be resolved to remote tags. Tags are
prioritized ahead of bookmarks.
- Legacy placeholder support used for unset user.name or user.email has been
removed. Commits containing these values will now be pushed with jj git push
without producing an error.
- If any side of a conflicted file is missing a terminating newline, then the
materialized file in the working copy will no longer be terminated by a
newline.
Deprecations
- The revset function diff_contains() has been renamed to diff_lines().
New features
- jj git fetch now shows details of abandoned commits (change IDs and
descriptions) by default, matching the jj abandon output format.
#3081
- jj workspace root now accepts an optional --name argument to show
the root path of the specified workspace (defaults to the current one). When
given a workspace that was created before this release, it errors out.
- jj git push --bookmark <name> will now automatically track the bookmark if
it isn't tracked with any remote already.
- Add git_web_url([remote]) template function that converts a git remote URL
to a web URL, suitable for opening in a browser. Defaults to the "origin"
remote.
- New divergent() revset function for divergent changes.
- String pattern values in revsets and templates can now be substituted by
aliases. For example, grep(x) = description(regex:x) now works.
- A new config option remotes.<name>.auto-track-created-bookmarks behaves
similarly to auto-track-bookmarks, but it only applies to bookmarks created
locally. Setting it to "*" is now the closest replacement for the deprecated
git.push-new-bookmarks option.
- jj tag list can now be filtered by revset.
- Conflict markers will use LF or CRLF as the line ending according to the
contents of the file.
#7376
- New experimental jj git fetch --tag flag to fetch tags in the same way as
bookmarks. If specified, tags won't be fetched implicitly, and only tags
matching the pattern will be fetched as <name>@<remote> tags. The fetched
remote tags will be tracked by the local tags of the same name.
- New remote_tags() revset function to query remote tags.
- New builtin hyperlink() template function that gracefully falls back to
text when outputting to a non-terminal, instead of emitting raw OSC 8 escape
codes. #7592
Fixed bugs
- jj git init --colocate now refuses to run inside a Git worktree, providing
a helpful error message with alternatives.
#8052
- jj git push now ensures that tracked remote bookmarks are updated even if
there are no mappings in the Git fetch refspecs.
#5115
- jj git fetch/push now forwards most of git stderr outputs such as
authentication requests. #5760
- Conflicted bookmarks and tags in trunk() will no longer generate verbose
warnings. The configured trunk() alias will temporarily be disabled.
#8501
- Dynamic shell completion for jj config unset now only completes
configuration options which are set.
#7774
- Dynamic shell completion no longer attempts to resolve aliases at the
completion position. This previously prevented a fully-typed alias from
being accepted on some shells and replaced it entirely with its expansion on
bash. Now, the completion will only resolve the alias, and suggest candidates
accordingly, after the cursor has been advanced to the next position.
#7773
- Setting the e |
| 0.37.0 | 8 de gener del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióAbout
jj is a Git-compatible version control system that is both simple and powerful. See
the installation instructions to get started.
Release highlights
- A new syntax for referring to hidden and divergent change IDs is available:
xyz/n where n is a number. For instance, xyz/0 refers to the latest
version of xyz, while xyz/1 refers to the previous version of xyz.
This allows you to perform actions like jj restore --from xyz/1 --to xyz to
restore xyz to its previous contents, if you made a mistake.
For divergent changes, the numeric suffix will always be shown in the log,
allowing you to disambiguate them in a similar manner.
Breaking changes
- String patterns in revsets, command
arguments, and configuration are now parsed as globs by default. Use
substring: or exact: prefix as needed.
- remotes.<name>.auto-track-bookmarks is now parsed the same way they
are in revsets and can be combined with logical operators.
- jj bookmark track/untrack now accepts --remote argument. If omitted, all
remote bookmarks matching the bookmark names will be tracked/untracked. The
old <bookmark>@<remote> syntax is deprecated in favor of <bookmark> --remote=<remote>.
- On Windows, symlinks that point to a path with / won't be supported. This
path is invalid on Windows.
- The template alias format_short_change_id_with_hidden_and_divergent_info(commit)
has been replaced by format_short_change_id_with_change_offset(commit).
- The following deprecated config options have been removed:
- git.push-bookmark-prefix
- ui.default-description
- ui.diff.format
- ui.diff.tool
- The deprecated commit_id.normal_hex() template method has been removed.
- Template expansion that did not produce a terminating newline will not be
fixed up to provide one by jj log, jj evolog, or jj op log.
- The diff conflict marker style can now use \\\\\\\ markers to indicate
the continuation of a conflict label from the previous line.
Deprecations
- The git_head() and git_refs() functions will be removed from revsets and
templates. git_head() should point to the first_parent(@) revision in
colocated repositories. git_refs() can be approximated as
remote_bookmarks(remote=glob:*) | tags().
New features
- Updated the executable bit representation in the local working copy to allow
ignoring executable bit changes on Unix. By default we try to detect the
filesystem's behavior, but this can be overridden manually by setting
working-copy.exec-bit-change = "respect" | "ignore".
- jj workspace add now also works for empty destination directories.
- jj git remote family of commands now supports different fetch and push URLs.
- [colors] table now supports dim = true attribute.
- In color-words diffs, context line numbers are now rendered with decreased
intensity.
- Hidden and divergent commits can now be unambiguously selected using their
change ID combined with a numeric suffix. For instance, if there are two
commits with change ID xyz, then one can be referred to as xyz/0 and the
other can be referred to as xyz/1. These suffixes are shown in the log when
necessary to make a change ID unambiguous.
- jj util gc now prunes unreachable files in .jj/repo/store/extra to save
disk space.
- Early version of a jj file search command for searching for a pattern in
files (like git grep).
- Conflict labels now contain information about where the sides of a conflict
came from (e.g. nlqwxzwn 7dd24e73 "first line of description").
- --insert-before now accepts a revset that resolves to an empty set when
used with --insert-after. The behavior is similar to --onto.
- jj tag list now supports --sort option.
- TreeDiffEntry type now has a display_diff_path() method that formats
renames/copies appropriately.
- TreeDiffEntry now has a status_char() method that returns
single-character status codes (M/A/D/C/R).
- CommitEvolutionEntry type now has a predecessors() method which
returns the predecessor commits (previous versions) of the entry's commit.
- CommitEvolutionEntry type now has a inter_diff() method which |
| 0.36.0 | 4 de desembre del 2025 | — | 64 bits ZIPARM64 ZIP Notes de la versióAbout
jj is a Git-compatible version control system that is both simple and powerful. See
the installation instructions to get started.
Release highlights
- The documentation has moved from https://jj-vcs.github.io/jj/ to
https://docs.jj-vcs.dev/.
301 redirects are being issued towards the new domain, so any existing links
should not be broken.
- Fixed race condition that could cause divergent operations when running
concurrent jj commands in colocated repositories. It is now safe to
continuously run e.g. jj log without --ignore-working-copy in one
terminal while you're running other commands in another terminal.
#6830
- jj now ignores $PAGER set in the environment and uses less -FRX on most
platforms (:builtin on Windows). See the docs for
more information, and #3502 for
motivation.
Breaking changes
- In filesets or path patterns, glob matching
is enabled by default. You can use cwd:"path" to match literal paths.
- In the following commands, string pattern
arguments are now parsed the same way they
are in revsets and can be combined with logical operators: jj bookmark delete/forget/list/move, jj tag delete/list, jj git clone/fetch/push
- In the following commands, unmatched bookmark/tag names is no longer an
error. A warning will be printed instead: jj bookmark delete/forget/move/track/untrack, jj tag delete, jj git clone/push
- The default string pattern syntax in revsets will be changed to glob: in a
future release. You can opt in to the new default by setting
ui.revsets-use-glob-by-default=true.
- Upgraded scm-record from v0.8.0 to v0.9.0. See release notes at
https://github.com/arxanas/scm-record/releases/tag/v0.9.0.
- The minimum supported Rust version (MSRV) is now 1.89.
- On macOS, the deprecated config directory ~/Library/Application Support/jj
is not read anymore. Use $XDG_CONFIG_HOME/jj instead (defaults to
~/.config/jj).
- Sub-repos are no longer tracked. Any directory containing .jj or .git
is ignored. Note that Git submodules are unaffected by this.
Deprecations
- The --destination/-d arguments for jj rebase, jj split, jj revert,
etc. were renamed to --onto/-o. The reasoning is that --onto,
--insert-before, and --insert-after are all destination arguments, so
calling one of them --destination was confusing and unclear. The old names
will be removed at some point in the future, but we realize that they are
deep in muscle memory, so you can expect an unusually long deprecation period.
- jj describe --edit is deprecated in favor of --editor.
- The config options git.auto-local-bookmark and git.push-new-bookmarks are
deprecated in favor of remotes.<name>.auto-track-bookmarks. For example:
[remotes.origin]
auto-track-bookmarks = "glob:*"
For more details, refer to
the docs.
- The flag --allow-new on jj git push is deprecated. In order to push new
bookmarks, please track them with jj bookmark track. Alternatively, consider
setting up an auto-tracking configuration to avoid the chore of tracking
bookmarks manually. For example:
[remotes.origin]
auto-track-bookmarks = "glob:*"
For more details, refer to
the docs.
New features
- jj commit, jj describe, jj squash, and jj split now accept
--editor, which ensures an editor will be opened with the commit
description even if one was provided via --message/-m.
- All jj commands show a warning when the provided fileset expression
doesn't match any files.
- Added files() template function to DiffStats. This supports per-file stats
like lines_added() and lines_removed()
- Added join() template function. This is different from separate() in that
it adds a separator between all arguments, even if empty.
- RepoPath template type now has a absolute() -> String method that returns
the absolute path as a string.
- Added format_path(path) template that controls how file paths are printed
with jj file list.
- New built-in revset aliases visible() and hidden().
- Unquoted * is now allowed in revsets. bookmarks(glob:foo*) no longer
needs quoting.
- jj prev/next --no-edit now generates an er |
| 0.35.0 | 6 de novembre del 2025 | — | 64 bits ZIP Notes de la versióAbout
jj is a Git-compatible version control system that is both simple and powerful. See
the installation instructions to get started.
Release highlights
- Workspaces can now have their own separate configuration. For instance, you
can use jj config set --workspace to update a configuration option only in
the current workspace.
- After creating a local bookmark, it is now possible to use jj bookmark track
to associate the bookmark with a specific remote before pushing it. When
pushing a tracked bookmark, it is not necessary to use --allow-new.
- The new jj git colocation enable and jj git colocation disable commands
allow converting between colocated and non-colocated workspaces.
Breaking changes
- The remote_bookmarks(remote=pattern) revset now includes Git-tracking
bookmarks if the specified pattern matches git. The default is
remote=~exact:"git" as before.
- The deprecated flag --summary of jj abandon has been removed.
- The deprecated command jj backout has been removed, use jj revert instead.
- The following deprecated config options have been removed:
- signing.sign-all
- core.watchman.register_snapshot_trigger
- diff.format
Deprecations
- jj bisect run --command <cmd> is deprecated in favor of
jj bisect run -- <cmd>.
- jj metaedit --update-committer-timestamp was renamed to
jj metaedit --force-rewrite since the old name (and help text)
incorrectly suggested that the committer name and email would not
be updated.
New features
- Workspaces may have an additional layered configuration, located at
.jj/workspace-config.toml. jj config subcommands which took layer options
like --repo now also support --workspace.
- jj bookmark track can now associate new local bookmarks with remote.
Tracked bookmarks can be pushed without --allow-new.
#7072
- The new jj git colocation command provides sub-commands to show the
colocation state (status), to convert a non-colocated workspace into
a colocated workspace (enable), and vice-versa (disable).
- New jj tag set/delete commands to create/update/delete tags locally.
Created/updated tags are currently always exported to Git as lightweight
tags. If you would prefer them to be exported as annotated tags, please give
us feedback on #7908.
- Templates now support a .split(separator, [limit]) method on strings to
split a string into a list of substrings.
- -G is now available as a short form of --no-graph in jj log, jj evolog,
jj op log, jj op show and jj op diff.
- jj metaedit now accepts -m/--message option to non-interactively update
the change description.
- The CryptographicSignature.key() template method now also works for SSH
signatures and returns the corresponding public key fingerprint.
- Added template-aliases.empty_commit_marker. Users can override this value in
their config to change the "(empty)" label on empty commits.
- Add support for --when.workspaces config scopes.
- Add support for --when.hostnames config scopes. This allows configuration to
be conditionally applied based on the hostname set in operation.hostname.
- jj bisect run accepts the command and arguments to pass to the command
directly as positional arguments, such as
jj bisect --range=..main -- cargo check --all-targets.
- Divergent changes are no longer marked red in immutable revisions. Since the
revision is immutable, the user shouldn't take any action, so the red color
was unnecessarily alarming.
- New commit template keywords local/remote_tags to show only local/remote
tags. These keywords may be useful in non-colocated Git repositories where
local and exported @git tags can point to different revisions.
- jj git clone now supports the --branch option to specify the branch(es)
to fetch during clone. If present, the first matching branch is used as the
working-copy parent.
- Revsets now support logical operators in string patterns.
Fixed bugs
- jj metaedit --author-timestamp twice with the same value no longer
edits the change twice in some cases.
- jj squash: fixed improper revision rebase when both --insert- |
| 0.34.0 | 1 d’octubre del 2025 | — | 64 bits ZIP Notes de la versióAbout
jj is a Git-compatible version control system that is both simple and powerful. See
the installation instructions to get started.
Release highlights
- Support for uploading changes to Gerrit Code Review with jj gerrit upload.
This lets you submit trees or multiple stacks of work at once. Support
for fetching changes, submitting changes, and other operations is not yet
implemented. This should be considered experimental, and we welcome feedback
on using it.
- Support for automated bisection using jj bisect run; this will continuously
bisect a commit range until a given commit is found to trigger a bug.
Breaking changes
- Git-based repositories are now colocated by default. Configure git.colocate = false to keep the previous behavior.
- Conflicts written by jj < 0.11 are no longer supported. They will now appear
as regular files with a .jjconflict suffix and JSON contents.
- The minimum supported Rust version (MSRV) is now 1.88.
Deprecations
- Various flags on jj describe and jj commit have been deprecated in favor
of jj metaedit. They are:
- describe: --author, --reset-author, --no-edit
- commit: --author, --reset-author
- The storage format of remote bookmarks and tags has changed. Remote bookmarks
will be written in both old and new formats to retain forward compatibility.
Git-tracking tags are also recorded for future native tagging support. This
change should be transparent, but let us know if you see anything odd.
New features
- The new command jj bisect run uses binary search to find a commit that
introduced a bug.
- The default editor on Unix is now nano instead of pico.
- New config option merge.hunk-level = "word" to enable word-level merging.
- New config option merge.same-change = "keep" to disable lossy resolution
rule for same-change conflicts.
#6369
- Templates now support a replace() method on strings for pattern-based
string replacement with optional limits. Supports all string patterns, including
regex with capture groups (e.g. "hello world".replace(regex:'(\w+) (\w+)', "$2 $1")).
- A new builtin hyperlink(url, text) template alias creates clickable
hyperlinks using OSC8 escape sequences
for terminals that support them.
- Added a new conditional configuration --when.platforms to include
settings only on certain platforms.
- External diff commands now support substitution variable $width for the
number of available terminal columns.
- The new jj gerrit upload command allows you to upload given revisions to an
instance of Gerrit Code Review.
- jj bookmark create/set/move use the working copy as a default again and
no longer require an explicit revision argument. This walks back a
deprecation from jj 0.26, as the community feedback was mostly negative.
- The revset function exactly(x, n) will now evaluate x and error if it does
not have exactly n elements.
- jj util exec now matches the exit status of the program it runs, and
doesn't print anything.
- jj config get now supports displaying array and table config values.
- jj util exec sets the environment variable JJ_WORKSPACE_ROOT
Fixed bugs
- Fetching repositories that have submodules no longer errors even if
submodule.recurse=true is set in .gitconfig (but jj still isn't able to
fetch the submodules or to operate on them).
Contributors
Thanks to the people who made this release happen!
- Angel Ezquerra (@AngelEzquerra)
- Anton Älgmyr (@algmyr)
- Antonin Delpeuch (@wetneb)
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Conner Petzold (@ConnerPetzold)
- Daniel Luz (@mernen)
- Daniele Sassoli (@DanieleSassoli)
- David Barsky (@davidbarsky)
- Dinu Blanovschi (@dnbln)
- Gaëtan Lehmann (@glehmann)
- George Christou (@gechr)
- Ian Wrzesinski (@isuffix)
- Ilya Grigoriev (@ilyagr)
- Isaac Corbrey (@icorbrey)
- Ivan Petkov (@ipetkov)
- Jonas Fierlings (@PigeonF)
- loudgolem (@phanirithvij)
- Martin von Zweigbergk (@martinvonz)
- Matt Stark (@matts1)
- Matt T. Proud (@matttproud)
- Michael Pratt (@prattmic)
- MochikoNyan (@MochikoNyan)
- Philip Metzger |
| 0.33.0 | 4 de setembre del 2025 | — | 64 bits ZIP Notes de la versió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 undo is now sequential: invoking it multiple times in sequence
repeatedly undoes actions in the operation log. Previously, jj undo would
only undo the most recent operation in the operation log. As a result, a new
jj redo command has been added.
- Experimental support for improving query performance over filesets and file
queries (like jj log path/to/file.txt) has been added. This is not enabled
by default. To enable this, you must use the jj debug index-changed-paths
command.
Breaking changes
- jj evolog templates now accept CommitEvolutionEntry as context type. To
get Commit properties, use commit.<method>(). To customize the default
output, set templates.evolog instead of templates.log.
- jj op show now uses templates.op_show configuration for its default template
instead of templates.op_log.
- The deprecated config option git.auto-local-branch has been removed. Use
git.auto-local-bookmark instead.
- The deprecated Signature.username() template method has been removed. Use
Signature.email().local() instead.
- The deprecated --config-toml flag has been removed. Use
--config=NAME=VALUE or --config-file=PATH instead.
- jj undo can now undo multiple operations progressively by calling it
repeatedly, whereas previously, running jj undo twice was previously a no-op
(it only undid the last change).
- jj git fetch will now only fetch the refspec patterns configured on remotes
when the --bookmark option is omitted. Only simple refspec patterns are
currently supported, and anything else (like refspecs which rename branches)
will be ignored.
- The conflict label used for coloring log graph nodes was renamed to
conflicted.
Deprecations
- The on-disk index format has changed. jj will write index files in both old
and new formats, so old jj versions should be able to read these index
files. This compatibility layer will be removed in a future release.
- jj op undo is deprecated in favor of jj op revert. (jj undo is still
available, but with new semantics. See also the breaking changes above.)
- The argument <operation> of jj undo is deprecated in favor of
jj op revert <operation>.
- The --what flag on jj undo is deprecated. Consider using
jj op restore --what instead.
New features
- The new command jj redo can progressively redo operations that were
previously undone by multiple calls to jj undo.
- Templates now support any() and all() methods on lists to check whether
any or all elements satisfy a predicate. Example: parents.any(|c| c.mine())
returns true if any parent commit is authored by the user.
- Add experimental support for indexing changed paths, which will speed up jj log PATH query, jj file annotate, etc. The changed-path index can be
enabled by jj debug index-changed-paths command. Indexing may take tens of
minutes depending on the number of merge commits. The indexing command UI is
subject to change. #4674
- jj config list now supports -T'json(self) ++ "\n"' serialization output.
- jj file show now accepts -T/--template option to insert file metadata.
- The template language now allows arbitrary whitespace between any operators.
- The new configuration option git.colocate=boolean controls whether or not
Git repositories are colocated by default.
- Both jj git clone and jj git init now take a --no-colocate flag to
disable colocation (in case git.colocate is set to true.)
- jj git remote add and jj git clone now support --fetch-tags to control
when tags are fetched for all subsequent fetches.
- jj git fetch now supports --tracked to fetch only tracked bookmarks.
- jj diff --stat now shows the change in size to binary files.
- jj interdiff, jj evolog -p, and jj op log -p now show diff of commit
descriptions.
- jj log and jj op log output can now be anonymized with the
builtin_log_redacted and builtin_op_log_redacted templates.
- jj git init now checks for an upstream rem |
| 0.32.0 | 6 d’agost del 2025 | — | 64 bits ZIP Notes de la versió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) or bookmarks(exact:name) to query divergent changes or
conflicted bookmarks. Commands like jj rebase no longer require all: 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 and jj util gc are run in a repository, old versions of
jj might get "commit not found" error on jj evolog.
- commit.working_copies() template method now returns List<WorkspaceRef>
- The previously predefined amend alias has been removed. You can restore it
by setting the config aliases.amend = ["squash"].
Deprecations
- The all: revset modifier and ui.always-allow-large-revsets setting is
planned to be removed in a future release.
#6016
- Rename the core.fsmonitor and core.watchman settings to
fsmonitor.backend, and fsmonitor.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() and first_ancestors() revset functions which are
similar to parents() and ancestors(), 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 and jj op log -p now show content diffs from the first
predecessor only. #7090
- jj git fetch no longer shows NaN% 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 (@Kissa |
| 0.31.0 | 2 de juliol del 2025 | — | 64 bits ZIP Notes de la versió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) |
| 0.30.0 | 4 de juny del 2025 | — | 64 bits ZIP Notes de la versióAbout
jj is a Git-compatible version control system that is both simple and powerful. See the installation instructions to get started.
Release highlights
- The experimental support from release 0.29.0 for transferring the change ID
to/from Git remotes has been enabled by default. The change ID is stored in
the Git commit itself (in a commit header called change-id), which means
it will be transferred by regular git push etc. Please let us know if you
run into any problems with it. You can disable it setting
git.write-change-id-header. Note that some Git remotes (e.g GitLab) and
some Git commands (e.g. git rebase) do not preserve the change ids when
they rewrite commits.
- jj rebase now automatically abandons divergent commits if another commit
with the same change ID is already present in the destination with identical
changes.
- jj split has gained --message, --insert-before, --insert-after, and
--destination options.
- jj evolog can show associated operations for commits created by new jj
versions.
Breaking changes
- The old libgit2 code path for fetches and pushes has been removed,
and the git.subprocess setting along with it.
- In templates, bookmark/tag/remote names are now formatted in revset symbol
notation. The type of bookmark.remote() is changed to Option<_>.
bookmark.remote() == "foo" still works, but bookmark.remote().<method>()
might need if(bookmark.remote(), ..) to suppress error.
- jj rebase now automatically abandons divergent commits if another commit
with the same change ID is already present in the destination with identical
changes. To keep these divergent commits, use the --keep-divergent flag.
- The deprecated --skip-empty flag for jj rebase has been removed. Use the
--skip-emptied flag instead.
- The deprecated jj branch subcommands have been removed. Use the jj bookmark subcommands instead.
- jj util completion now requires the name of the shell as a positional
argument and no longer produces Bash completions by default. The deprecated
optional arguments for different shells have been removed.
Deprecations
- The ui.diff.format and ui.diff.tool config options have been merged as
ui.diff-formatter. The builtin format can be specified as :<format>
(e.g. ui.diff-formatter=":git" for Git diffs.)
- The .normal_hex() method will be removed from the CommitId template type.
It's useful only for the ChangeId type.
New features
- jj split has gained a --message option to set the description of the
commit with the selected changes.
- jj split has gained the ability to place the revision with the selected
changes anywhere in the revision tree with the --insert-before,
--insert-after and --destination command line flags.
- Added git.track-default-bookmark-on-clone setting to control whether to
track the default remote bookmark on jj git clone.
- Templates can now do arithmetic on integers with the +, -, *, /, and
% infix operators.
- Evolution history is now stored in the operation log. jj evolog can show
associated operations for commits created by new jj versions.
Fixed bugs
- Work around a git issue that could cause subprocess operations to hang if the
core.fsmonitor gitconfig is set in the global or system gitconfigs.
#6440
- jj parallelize can now parallelize groups of changes that start with an
immutable change, but do not contain any other immutable changes.
- jj will no longer warn about deprecated paths on macOS if the configured
XDG directory is the deprecated one (~/Library/Application Support).
- The builtin diff editor now correctly handles splitting changes where a file
is replaced by a directory of the same name.
#5189
Packaging changes
- Due to the removal of the libgit2 code path, packagers should remove any
dependencies on libgit2, libssh2, Zlib, OpenSSL, and pkg-config, and
ensure they are not setting the Cargo git2 or vendored-openssl features.
Contributors
Thanks to the people who made this release happen!
- Alper Cugun (@alper)
- Austin Seipp (@thoughtpolice)
- Benjamin Brittain (@benbrittain) |
| 0.29.0 | 7 de maig del 2025 | — | 64 bits ZIP Notes de la versióAbout
jj is a Git-compatible version control system that is both simple and powerful. See the installation instructions to get started.
Release highlights
- Experimental support for transferring the change ID to/from Git remotes behind configuration
setting git.write-change-id-header. If this is enabled, the change ID will be stored in the Git
commit itself (in a commit header called change-id), which means it will be transferred by
regular git push etc. This is an evolving feature that currently defaults to "false". This
default will likely change in the future as we gain confidence with forge support and user
expectations.
Breaking changes
- jj git push -c/--change no longer moves existing local bookmarks.
- The editor-*.jjdescription files passed to your editor by e.g. jj describe
are now written to your system's temporary directory instead of .jj/repo/.
Deprecations
- git.subprocess = false has been deprecated, and the old libgit2
code path for fetches and pushes will be removed entirely in 0.30.
Please report any remaining issues you have with the Git
subprocessing path.
- ui.default-description has been deprecated, and will be migrated to
template-aliases.default_commit_description. Please also consider using
templates.draft_commit_description,
and/or templates.commit_trailers.
- On macOS, config.toml files in ~/Library/Application Support/jj are
deprecated; one should instead use $XDG_CONFIG_HOME/jj
(defaults to ~/.config/jj)
New features
- Color-words diff has gained an option to compare conflict pairs without
materializing.
- jj show patches can now be suppressed with --no-patch.
- Added ui.bookmark-list-sort-keys setting to configure default sort keys for the
jj bookmark list command.
- New signed revset function to filter for cryptographically signed commits.
- jj describe, jj commit, jj new, jj squash and jj split add the
commit trailers, configured in the commit_trailers template, to the commit
description. Use cases include DCO Sign Off and Gerrit Change Id.
- Added duplicate_description template, which allows customizing the descriptions
of the commits jj duplicate creates.
- jj absorb can now squash a deleted file if it was added by one of the
destination revisions.
- Added ui.streampager.show-ruler setting to configure whether the ruler should be
shown when the builtin pager starts up.
- jj git fetch now warns instead of erroring for unknown git.fetch remotes
if other remotes are available.
- Commit objects in templates now have trailers() -> List<Trailer>, the Trailer
objects have key() -> String and value() -> String.
- jj config edit will now roll back to previous version if a syntax error has been introduced in the new config.
- When using dynamic command-line completion, revision names will be completed
in more complex expressions. For example, typing
jj log -r first-bookmark..sec and then pressing Tab could complete the
expression to first-bookmark..second-bookmark.
Fixed bugs
- Fixed crash on change-delete conflict resolution. #6250
- The builtin diff editor now tries to preserve unresolved conflicts. #4963
- Fixed bash and zsh shell completion when completing aliases of multiple arguments. #5377
Packaging changes
- Jujutsu now uses zlib-rs, a fast compression library written in Rust. Packagers should remove any dependency on CMake and drop the packaging Cargo feature.
Contributors
Thanks to the people who made this release happen!
- Aleksey Kuznetsov (@zummenix)
- Austin Seipp (@thoughtpolice)
- Benjamin Brittain (@benbrittain)
- Benjamin Tan (@bnjmnt4n)
- Caleb White (@calebdw)
- Daniel Luz (@mernen)
- Emily (@emilazy)
- Emily (@neongreen)
- Gaëtan Lehmann (@glehmann)
- George Christou (@gechr)
- Ilya Grigoriev (@ilyagr)
- Jacob Hayes (@JacobHayes)
- Jonas Greitemann (@jgreitemann)
- Josh Steadmon (@steadmon)
- Martin von Zweigbergk (@martinvonz)
- Mateus Auler (@mateusauler)
- Nicole Patricia Mazzuca (@strega-nil)
- Nils Koch (@nilskch)
- Philip Metzger (@PhilipMetzger)
- Remo Senekowitsch (@senekor) |
| 0.28.2 | 7 d’abril del 2025 | — | 64 bits ZIP Notes de la versióFixed bugs
- Fixed problem that old commits could be re-imported from Git.
GitoxideLabs/gitoxide#1928 |
| 0.28.0 | 3 d’abril del 2025 | — | 64 bits ZIP Notes de la versió> [!WARNING]
> `jj-cli` has not yet been published to https://crates.io; see https://github.com/jj-vcs/jj/issues/6223.
>
> Things are still in flux, so the plan may change, but most likely we'll release a new minor version in a bit, possibly a few days.
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 of `jj squash` and
`jj diffedit --restore-descendants`.
- The `jj untrack` subcommand has been removed in favor of `jj 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()` and `conflict()`, which were renamed to plural forms.
- `files(x, y, ..)` with multiple patterns. Use `files(x|y|..)` instead.
- The following deprecated template functions have been removed:
- `branches()`, `local_branches()`, and `remote_branches()`, which were
renamed to "bookmarks".
- The flags `--all` and `--tracked` on `jj 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 to `core.watchman.register-snapshot-trigger` for consistency with other configuration options.
- `jj backout` is deprecated in favor of `jj revert`.
New features
- `jj sign` can now sign with PKCS#12 certificates through the `gpgsm` backend.
- `jj sign` will automatically use the gpg key associated with the author's email
in the absence of a `signing.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 the `builtin_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 as `jj 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 setting `hints.resolving-conflicts = false`.
- `jj op diff` and `jj op log --op-diff` now show changes to which commits
correspond to working copies.
- `jj op log -d` is now an alias for `jj op log --op-diff`.
- `jj bookmark move --to/--from` can now be abbreviated to `jj bookmark move -t/-f`
- `jj bookmark list` now supports `--sort` option. Similar to `git branch --sort`.
See `jj bookmark list --help` for more details.
- A new command `jj revert` is added, which is similar to `jj 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 j |
| 0.27.0 | 6 de març del 2025 | — | 64 bits ZIP |
| 0.26.0 | 8 de febrer del 2025 | — | 64 bits ZIP Notes de la versió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 the `git.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 the `ui.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 on `jj git push --all`.
#3505
- `jj init --git` and `jj init --git-repo` have been removed. They were
- deprecated in early 2024. Use `jj git init` instead.
- The following deprecated commands have been removed:
- `jj cat` is replaced by `jj file show`.
- `jj chmod` is replaced by `jj file chmod`.
- `jj files` is replaced by `jj file list`.
- The deprecated `-l` short alias for `--limit` in `jj log`, `jj op log`
- and `jj obslog` has been removed. The `-n` short alias can be used instead.
- The deprecated `--siblings` options for `jj 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 to `jj resolve`.
- `jj util mangen` is replaced with `jj util install-man-pages`, which can
- install man pages for all `jj` subcommands to a given path.
- In `jj config list` template, `value` is now typed as `ConfigValue`, 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 by `jj 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 external `git` subprocess, via
- the `git.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` and `jj 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 to `jj op
- log -T` for a more compact output. You can use `format_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
- wi |
| 0.25.0 | 7 de gener del 2025 | — | 64 bits ZIP Notes de la versió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](https://jj-vcs.github.io/jj/v0.25.0/config#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 as `jj
- 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 a `JJ: ignore-rest` line that ignores everything
- below it, similar to a "scissor line" in git. When editing multiple commits,
- only ignore until the next `JJ: 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 to |
| 0.24.0 | 4 de desembre del 2024 | — | 64 bits ZIP Notes de la versió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 alias `jj 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 for `Boolean`,
`Integer`, and `String` 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, like `jj rebase -r` and `jj 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
- running `jj 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 optional `pattern` argument,
- mirroring that of `bookmarks()`.
- 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 Svel |
| 0.23.0 | 7 de novembre del 2024 | — | 64 bits ZIP |
| 0.22.0 | 2 d’octubre del 2024 | — | 64 bits ZIP |
| 0.21.0 | 4 de setembre del 2024 | — | 64 bits ZIP |
| 0.20.0 | 21 de febrer del 2025 | — | 64 bits ZIP |
| 0.19.0 | 21 de febrer del 2025 | — | 64 bits ZIP |
| 0.18.0 | 21 de febrer del 2025 | — | 64 bits ZIP |
| 0.17.1 | 21 de febrer del 2025 | — | 64 bits ZIP |
| 0.17.0 | 21 de febrer del 2025 | — | 64 bits ZIP |
| 0.16.0 | 21 de febrer del 2025 | — | 64 bits ZIP |
| 0.15.1 | 21 de febrer del 2025 | — | 64 bits ZIP Notes de la versióNo code changes (fixing Rust Cargo.toml stuff). |
| 0.8.0 | 22 de febrer del 2025 | — | 64 bits ZIP |