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 calledchange-id), which means it will be transferred by regulargit pushetc. 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/--changeno longer moves existing local bookmarks. -
The
editor-*.jjdescriptionfiles passed to your editor by e.g.jj describeare now written to your system's temporary directory instead of.jj/repo/.
Deprecations
-
git.subprocess = falsehas been deprecated, and the oldlibgit2code 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-descriptionhas been deprecated, and will be migrated totemplate-aliases.default_commit_description. Please also consider usingtemplates.draft_commit_description, and/ortemplates.commit_trailers. -
On macOS, config.toml files in
~/Library/Application Support/jjare 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 showpatches can now be suppressed with--no-patch. -
Added
ui.bookmark-list-sort-keyssetting to configure default sort keys for thejj bookmark listcommand. -
New
signedrevset function to filter for cryptographically signed commits. -
jj describe,jj commit,jj new,jj squashandjj splitadd the commit trailers, configured in thecommit_trailerstemplate, to the commit description. Use cases include DCO Sign Off and Gerrit Change Id. -
Added
duplicate_descriptiontemplate, which allows customizing the descriptions of the commitsjj duplicatecreates. -
jj absorbcan now squash a deleted file if it was added by one of the destination revisions. -
Added
ui.streampager.show-rulersetting to configure whether the ruler should be shown when the builtin pager starts up. -
jj git fetchnow warns instead of erroring for unknowngit.fetchremotes if other remotes are available. -
Commit objects in templates now have
trailers() -> List<Trailer>, the Trailer objects havekey() -> Stringandvalue() -> String. -
jj config editwill 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..secand then pressing Tab could complete the expression tofirst-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 thepackagingCargo 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)
- Sam (@Samasaur1)
- Steve Fink (@hotsphink)
- Théo Daron (@tdaron)
- TimerErTim (@TimerErTim)
- Vincent Ging Ho Yim (@cenviity)
- Winter (@winterqt)
- Yuya Nishihara (@yuja)