Skip to content

Releases: jj-vcs/jj

v0.28.2

07 Apr 15:46
Compare
Choose a tag to compare

Fixed bugs

v0.28.1

05 Apr 04:18
Compare
Choose a tag to compare

Note

Also see the v0.28.0 release notes.

About

jj is a Git-compatible version control system that is both simple and powerful. See the installation instructions to get started.

Security fixes

Fixed bugs

  • Resolved some potential build issues for packagers.
    #6232

  • Fix a bug with :ours and :theirs merge tools involving conflicted trees
    with more than two sides. #6227

Contributors

Thanks to the people who made this release happen!

v0.28.0

03 Apr 02:23
Compare
Choose a tag to compare

Important

v0.28.0 was yanked from https://crates.io and superseded by v0.28.1.

About

jj is a Git-compatible version control system that is both simple and powerful. See the installation instructions to get started.

Release highlights

  • jj's configuration can now be split into multiple files more easily.

  • jj resolve now accepts built-in tools :ours and :theirs.

  • In colocated repos, newly-created files will now appear in git diff.

  • A long-standing bug relating to empty files in the built-in diff editor was
    fixed. #3702

Breaking changes

  • The minimum supported Rust version (MSRV) is now 1.84.0.

  • The git.push-branch-prefix config has been removed in favor of
    git.push-bookmark-prefix.

  • jj abandon no longer supports --summary to suppress the list of abandoned
    commits. The list won't show more than 10 commits to not clutter the console.

  • jj unsquash has been removed in favor 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 jj considers added in the working copy will
    now show up in git diff (as if you had run git add --intent-to-add on
    them).

  • Reversing colors is now supported. For example, to highlight words by
    reversing colors rather than underlining, you can set
    colors."diff token"={ underline = false, reverse = true } in your config.

  • Added revsets.log-graph-prioritize, which can be used to configure
    which branch in the jj log graph is displayed on the left instead of @
    (e.g. coalesce(description("megamerge\n"), trunk()))

  • jj resolve now accepts new built-in merge tools :ours and :theirs.
    These merge tools accept side #1 and side #2 of the conflict respectively.

Fixed bugs

  • jj log -p --stat now shows diff stats as well as the default color-words/git
    diff output. #5986

  • The built-in diff editor now correctly handles deleted files.
    #3702

  • The built-in diff editor now correctly retains the executable bit on newly
    added files when splitting. #3846

  • jj config set/--config value parsing rule is relaxed in a way that
    unquoted apostrophes are allowed.
    #5748

  • jj fix could previously create new conflicts when a descendant of a fixed
    revision was already correctly formatted.

Contributors

Thanks to the people who made this release happen!

v0.27.0

06 Mar 00:11
Compare
Choose a tag to compare

About

jj is a Git-compatible version control system that is both simple and powerful. See the installation instructions to get started.

Release highlights

  • git.subprocess is now enabled by default, improving compatibility with Git
    fetches and pushes by spawning an external git process. Users can opt out
    of this by setting git.subprocess = false, but this will likely be removed
    in a future release. Please report any issues you run into.

Breaking changes

  • Bookmark name to be created/updated is now parsed as a revset
    symbol
    . Quotation may be needed in addition to shell
    quotes. Example: jj bookmark create -r@- "'name with space'"

  • jj bookmark create, jj bookmark set and jj bookmark move onto a hidden
    commit make it visible.

  • jj bookmark forget now untracks any corresponding remote bookmarks instead
    of forgetting them, since forgetting a remote bookmark can be unintuitive.
    The old behavior is still available with the new --include-remotes flag.

  • jj fix now always sets the working directory of invoked tools to be the
    workspace root, instead of the working directory of the jj fix.

  • The ui.allow-filesets configuration option has been removed.
    The "fileset" language has been enabled by default since v0.20.

  • templates.annotate_commit_summary is renamed to templates.file_annotate,
    and now has an implicit self parameter of type AnnotationLine, instead of
    Commit. All methods on Commit can be accessed with commit.method(), or
    self.commit().method().

Deprecations

  • This release takes the first steps to make target revision required in
    bookmark create, bookmark move and bookmark set. Those commands will display
    a warning if the user does not specify target revision explicitly. In the near
    future those commands will fail if target revision is not specified.

  • The signing.sign-all config option has been deprecated in favor of
    signing.behavior. The new option accepts drop (never sign), keep (preserve
    existing signatures), own (sign own commits), or force (sign all commits).
    Existing signing.sign-all = true translates to signing.behavior = "own", and
    false translates to "keep". Invalid configuration is now an error.

New features

  • The new jj sign and jj unsign commands allow for signing/unsigning commits.
    jj sign supports configuring the default revset through revsets.sign when
    no --revisions arguments are provided.

  • jj git fetch now supports string pattern syntax
    on --remote option and git.fetch configuration.

  • Template functions truncate_start() and truncate_end() gained an optional
    ellipsis parameter; passing this prepends or appends the ellipsis to the
    content if it is truncated to fit the maximum width.

  • Templates now support stringify(x) function and string method
    .escape_json(). The latter serializes the string in JSON format. It is
    useful for making machine-readable templates by escaping problematic
    characters like \n.

  • Templates now support trim(), trim_start() and trim_end() methods
    which remove whitespace from the start and end of a String type.

  • The description of commits backed out by jj backout can now be configured
    using templates.backout_description.

  • New AnnotationLine templater type. Used in templates.file_annotate.
    Provides self.commit(), .content(), .line_number(), and
    .first_line_in_hunk().

  • Templates now have format_short_operation_id(id) function for users to
    customize the default operation id representation.

  • The jj init/jj revert stubs that print errors can now be overridden with
    aliases. All of jj clone/init/revert add a hint to a generic error.

  • Help text is now colored (when stdout is a terminal).

  • Commands that used to suggest --ignore-immutable now print the number of
    immutable commits that would be rewritten if used and a link to the docs.

  • jj undo now shows a hint when undoing an undo operation that the user may
    be looking for jj op restore instead.

Fixed bugs

  • jj status now shows untracked files under untracked directories.
    #5389

  • Added workaround for the bug that untracked files are ignored when watchman is
    enabled. #5728

  • The signing.backends.ssh.allowed-signers configuration option will now
    expand ~/ to $HOME/.
    #5626

  • config-schema.json now allows arrays of strings for the settings ui.editor
    and ui.diff.tool.

  • config-schema.json now allows an array of strings or nested table for the
    ui.pager setting.

Contributors

Thanks to the people who made this release happen!

v0.26.0

06 Feb 03:11
Compare
Choose a tag to compare

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
    libgit2s 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
    width.

  • Templater now supports list.filter(|x| ..) method.

  • The diff commit template keyword now supports custom formatting via
    diff.files(). For example, diff.files().map(|e| e.path().display()) prints
    changed file paths.

  • The diff.stat() template method now provides methods to get summary values.

  • jj log can now show cryptographic commit signatures. The output can be
    controlled by the ui.show-cryptographic-signatures=true config knob. The
    signature template can be customized using
    format_detailed_cryptographic_signature(signature) and
    format_short_cryptographic_signature(signature).

  • New git.sign-on-push config option to automatically sign commits which are
    being pushed to a Git remote.

  • New git.push-new-bookmarks config option to push new bookmarks without
    --allow-new.

  • jj status now shows untracked files when they reside directly under a
    tracked directory. There's still an issue that files under untracked
    directories aren't listed. #5389

  • New merge-tools.<TOOL>.diff-expected-exit-codes config option to suppress
    warnings from tools exiting with non-zero exit codes.

  • New fix.tools.TOOL.enabled config option to enable/disable tools. This is
    useful for defining disabled tools in user configuration that can be enabled
    in individual repositories with one config setting.

  • Added --into flag to jj restore, similarly to jj squash and jj absorb. It is equivalent to --to, but --into is the recommended name.

  • Italic text is now supported. You can set e.g. color.error = { fg = "red", italic = true } in your config.

  • New author_name/author_email/committer_name/committer_email(pattern)
    revset functions to match either name or email field explicitly.

  • New subject(pattern) revset function that matches first line of commit
    descriptions.

  • Conditional configuration now supports --when.commands to change
    configuration based on subcommand.

  • The Jujutsu documentation site now publishes a schema for the official
    configuration file, which can be integrated into your editor for autocomplete,
    inline errors, and more.
    Please see the documentation for more
    on this.

Fixed bugs

  • jj git fetch with multiple remotes will now fetch from all remotes before
    importing refs into the jj repo. This fixes a race condition where the
    treatment of a commit that is found in multiple fetch remotes depended on the
    order the remotes were specified.

  • Fixed diff selection by external tools with jj split/commit -i FILESETS.
    #5252

  • Conditional configuration now applies when initializing new repository.
    #5144

  • [diff.<format>] configuration now applies to .diff().<format>() commit
    template methods.

  • Conflicts at the end of files which don't end with a newline character are
    now materialized in a way that can be parsed correctly.
    #3968

  • Bookmark and remote names written by jj git clone to
    revset-aliases.'trunk()' are now escaped if necessary.
    #5359

Contributors

Thanks to the people who made this release happen!

v0.25.0

02 Jan 04:01
Compare
Choose a tag to compare

About

jj is a Git-compatible version control system that is both simple and powerful. See the installation instructions to get started.

Release highlights

It's the holidays, and this release was overall pretty quiet, without many major
changes. Two select improvements:

  • Improvements to configuration management, including support for conditional
    variables
    in config files.

  • Large files in the working copy will no longer cause commands to fail; instead
    the large files will remain intact but untracked in the working copy.

Breaking changes

  • Configuration variables are no longer "stringly" typed. For example, true is
    not converted to a string "true", and vice versa.

  • The following configuration variables are now parsed strictly:
    colors.<labels>, git.abandon-unreachable-commits,
    git.auto-local-bookmark, git.push-bookmark-prefix, revsets.log,
    revsets.short-prefixes signing.backend, operation.hostname,
    operation.username, ui.allow-init-native, ui.color,
    ui.default-description, ui.progress-indicator, ui.quiet, user.email,
    user.name

  • jj config list now prints inline tables { key = value, .. } literally.
    Inner items of inline tables are no longer merged across configuration files.
    See the table syntax documentation for details.

  • jj config edit --user now opens a file even if $JJ_CONFIG points to a
    directory. If there are multiple config files, the command will fail.

  • jj config set no longer accepts a bare string value that looks like a TOML
    expression. For example, jj config set NAME '[foo]' must be quoted 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 tool.

Contributors

Thanks to the people who made this release happen!

v0.24.0

04 Dec 20:47
Compare
Choose a tag to compare

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!

v0.23.0

07 Nov 05:58
Compare
Choose a tag to compare

Security fixes

Breaking changes

  • Revset function names can no longer start with a number.

  • Evaluation error of revsets.short-prefixes configuration is now reported.

  • The HEAD@git symbol no longer resolves to the Git HEAD revision. Use
    git_head() or @- revset expression instead. The git_head template
    keyword now returns a boolean.

  • Help command doesn't work recursively anymore, i.e. jj workspace help root
    doesn't work anymore.

  • The color label op_log from the [colors] config section now only
    applies to the op log and not to the other places operations are displayed. In
    almost all cases, if you configured op_log before, you should use the new
    operation label instead.

  • Default operation log template now shows end times of operations instead of
    start times.

Deprecations

  • git.auto-local-bookmark replaces git.auto-local-branch. The latter remains
    supported for now (at lower precedence than the former).

New features

  • Added diff options to ignore whitespace when comparing lines. Whitespace
    changes are still highlighted.

  • New command jj simplify-parents will remove redundant parent edges.

  • jj squash now supports -f/-t shorthands for --from/--[in]to.

  • Initial support for shallow Git repositories has been implemented. However,
    deepening the history of a shallow repository is not yet supported.

  • jj git clone now accepts a --depth <DEPTH> option, which
    allows to clone the repository with a given depth.

  • New command jj file annotate that annotates files line by line. This is similar
    in functionality to git blame. Invoke the command with jj file annotate <file_path>.
    The output can be customized via the templates.annotate_commit_summary
    config variable.

  • jj bookmark list gained a --remote REMOTE option to display bookmarks
    belonging to a remote. This option can be combined with --tracked or
    --conflicted.

  • New command jj config unset that unsets config values. For example,
    jj config unset --user user.name.

  • jj help now has the flag --keyword (shorthand -k), which can give help
    for some keywords (e.g. jj help -k revsets). To see a list of the available
    keywords you can do jj help --help.

  • New at_operation(op, expr) revset can be used in order to query revisions
    based on historical state.

  • String literals in filesets, revsets and templates now support hex bytes
    (with \e as escape / shorthand for \x1b).

  • New coalesce(revsets...) revset which returns commits in the first revset
    in the revsets list that does not evaluate to none().

  • New template function raw_escape_sequence(...) preserves escape sequences.

  • Timestamp objects in templates now have after(date) -> Boolean and
    before(date) -> Boolean methods for comparing timestamps to other dates.

  • New template functions pad_start(), pad_end(), truncate_start(), and
    truncate_end() are added.

  • Add a new template alias builtin_log_compact_full_description().

  • Added the config settings diff.color-words.context and diff.git.context to
    control the default number of lines of context shown.

Fixed bugs

  • Error on trunk() revset resolution is now handled gracefully.
    #4616

  • Updated the built-in diff editor scm-record to version
    0.4.0, which
    includes multiple fixes.

Contributors

Thanks to the people who made this release happen!

v0.22.0

02 Oct 17:27
Compare
Choose a tag to compare

Breaking changes

  • Fixing #4239 means the
    ordering of some messages have changed.

  • Invalid ui.graph.style configuration is now an error.

  • The builtin template branch_list has been renamed to bookmark_list as part
    of the jj branch deprecation.

Deprecations

  • jj branch has been deprecated in favor of jj bookmark.

    Rationale: Jujutsu's branches don't behave like Git branches, which a
    confused many newcomers, as they expected a similar behavior given the name.
    We've renamed them to "bookmarks" to match the actual behavior, as we think
    that describes them better, and they also behave similar to Mercurial's
    bookmarks.

  • jj obslog is now called jj evolution-log/jj evolog. jj obslog remains
    as an alias.

  • jj unsquash has been deprecated in favor of jj squash and
    jj diffedit --restore-descendants.

    Rationale: jj squash can be used in interactive mode to pull
    changes from one commit to another, including from a parent commit
    to a child commit. For fine-grained dependent diffs, such as when
    the parent and the child commits must successively modify the same
    location in a file, jj diffedit --restore-descendants can be used
    to set the parent commit to the desired content without altering the
    content of the child commit.

  • The git.push-branch-prefix config has been deprecated in favor of
    git.push-bookmark-prefix.

  • conflict() and file() revsets have been renamed to conflicts() and files()
    respectively. The old names are still around and will be removed in a future
    release.

New features

  • The new config option snapshot.auto-track lets you automatically track only
    the specified paths (all paths by default). Use the new jj file track
    command to manually tracks path that were not automatically tracked. There is
    no way to list untracked files yet. Use git status in a colocated workspace
    as a workaround.
    #323

  • jj fix now allows fixing unchanged files with the --include-unchanged-files flag. This
    can be used to more easily introduce automatic formatting changes in a new
    commit separate from other changes.

  • jj workspace add now accepts a --sparse-patterns=<MODE> option, which
    allows control of the sparse patterns for a newly created workspace: copy
    (inherit from parent; default), full (full working copy), or empty (the
    empty working copy).

  • New command jj workspace rename that can rename the current workspace.

  • jj op log gained an option to include operation diffs.

  • jj git clone now accepts a --remote <REMOTE NAME> option, which
    allows to set a name for the remote instead of using the default
    origin.

  • jj op undo now reports information on the operation that has been undone.

  • jj squash: the -k flag can be used as a shorthand for --keep-emptied.

  • CommitId / ChangeId template types now support .normal_hex().

  • jj commit and jj describe now accept --author option allowing to quickly change
    author of given commit.

  • jj diffedit, jj abandon, and jj restore now accept a --restore-descendants
    flag. When used, descendants of the edited or deleted commits will keep their original
    content.

  • jj git fetch -b <remote-git-branch-name> will now warn if the branch(es)
    can not be found in any of the specified/configured remotes.

  • jj split now lets the user select all changes in interactive mode. This may be used
    to keeping all changes into the first commit while keeping the current commit
    description for the second commit (the newly created empty one).

  • Author and committer names are now yellow by default.

Fixed bugs

  • Update working copy before reporting changes. This prevents errors during reporting
    from leaving the working copy in a stale state.

  • Fixed panic when parsing invalid conflict markers of a particular form.
    (#2611)

  • Editing a hidden commit now makes it visible.

  • The present() revset now suppresses missing working copy error. For example,
    present(@) evaluates to none() if the current workspace has no
    working-copy commit.

Contributors

Thanks to the people who made this release happen!

v0.21.0

04 Sep 17:15
Compare
Choose a tag to compare

Breaking changes

  • next/prev will no longer infer when to go into edit mode when moving from
    commit to commit. It now either follows the flags --edit|--no-edit or it
    gets the mode from ui.movement.edit.

Deprecations

  • jj untrack has been renamed to jj file untrack.

New features

  • Add new boolean config knob, ui.movement.edit for controlling the behaviour
    of prev/next. The flag turns edit mode on and off permanently when set
    respectively to true or false.

  • All diff formats except --name-only now include information about copies and
    moves. So do external diff tools in file-by-file mode. jj status also
    includes information about copies and moves.

  • Color-words diff has gained an option to display complex changes as separate
    lines
    . It's enabled by default. To
    restore the old behavior, set diff.color-words.max-inline-alternation = -1.

  • A tilde (~) at the start of the path will now be expanded to the user's home
    directory when configuring a signing.key for SSH commit signing.

  • When reconfiguring the author, warn that the working copy won't be updated

Fixed bugs

  • Release binaries for Intel Macs have been restored. They were previously
    broken due to using a sunset version of GitHub's macOS runners (but nobody had
    previously complained.)

Contributors

Thanks to the people who made this release happen!