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 regulargit pushetc. Please let us know if you run into any problems with it. You can disable it settinggit.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 rebasenow automatically abandons divergent commits if another commit with the same change ID is already present in the destination with identical changes. -
jj splithas gained--message,--insert-before,--insert-after, and--destinationoptions. -
jj evologcan show associated operations for commits created by new jj versions.
Breaking changes
-
The old
libgit2code path for fetches and pushes has been removed, and thegit.subprocesssetting along with it. -
In templates, bookmark/tag/remote names are now formatted in revset symbol notation. The type of
bookmark.remote()is changed toOption<_>.bookmark.remote() == "foo"still works, butbookmark.remote().<method>()might needif(bookmark.remote(), ..)to suppress error. -
jj rebasenow 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-divergentflag. -
The deprecated
--skip-emptyflag forjj rebasehas been removed. Use the--skip-emptiedflag instead. -
The deprecated
jj branchsubcommands have been removed. Use thejj bookmarksubcommands instead. -
jj util completionnow 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. -
(Update: this entry was mistakenly omitted in the release notes previously) External diff tools are now run in the temporary directory containing the before (
left) and after (right) directories, making diffs appear more pleasing for tools that display file paths prominently. Users can opt out of this by settingmerge-tools.<tool>.diff-do-chdir = false, but this will likely be removed in a future release. Please report any issues you run into.
Deprecations
-
The
ui.diff.formatandui.diff.toolconfig options have been merged asui.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 theCommitIdtemplate type. It's useful only for theChangeIdtype.
New features
-
jj splithas gained a--messageoption to set the description of the commit with the selected changes. -
jj splithas gained the ability to place the revision with the selected changes anywhere in the revision tree with the--insert-before,--insert-afterand--destinationcommand line flags. -
Added
git.track-default-bookmark-on-clonesetting to control whether to track the default remote bookmark onjj git clone. -
Templates can now do arithmetic on integers with the
+,-,*,/, and%infix operators. -
Evolution history is now stored in the operation log.
jj evologcan 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.fsmonitorgitconfig is set in the global or system gitconfigs. #6440 -
jj parallelizecan now parallelize groups of changes that start with an immutable change, but do not contain any other immutable changes. -
jjwill 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
libgit2code path, packagers should remove any dependencies onlibgit2,libssh2, Zlib, OpenSSL, andpkg-config, and ensure they are not setting the Cargogit2orvendored-opensslfeatures.
Contributors
Thanks to the people who made this release happen!
- Alper Cugun (@alper)
- Austin Seipp (@thoughtpolice)
- Benjamin Brittain (@benbrittain)
- Benjamin Tan (@bnjmnt4n)
- Bryce Berger (@bryceberger)
- Colin Nelson (@orthros)
- Doug Stephen (@dljsjr)
- Emily (@emilazy)
- Eyvind Bernhardsen (@eyvind)
- Felix Geisendörfer (@felixge)
- Gaëtan Lehmann (@glehmann)
- Ilya Grigoriev (@ilyagr)
- Isaac Corbrey (@icorbrey)
- Jonas Greitemann (@jgreitemann)
- Josep Mengual (@truita)
- kkoang (@kkoang)
- Manuel Mendez (@mmlb)
- Marshall Bowers (@maxdeviant)
- Martin von Zweigbergk (@martinvonz)
- Mateus Auler (@mateusauler)
- Michael Pratt (@prattmic)
- Nicole Patricia Mazzuca (@strega-nil)
- Philip Metzger (@PhilipMetzger)
- Scott Taylor (@scott2000)
- T6 (@tjjfvi)
- Vincent Ging Ho Yim (@cenviity)
- Winter (@winterqt)
- Yuya Nishihara (@yuja)