Skip to content

Releases: tim-janik/jj-fzf

JJ-FZF 0.34.0

02 Oct 02:37

Choose a tag to compare

JJ-FZF 0.34.0 - 2025-10-02

Added:

  • In the last month, jj-fzf underwent a complete rewrite. The new version has
    out of the box support for running jj commands with multiple revisions and
    extends utilization of new jj and fzf features.

  • All key binding commands now operate on a change_id or a list thereof.

  • In case of divergent commits, an fzf list entry now expands to a commit_id,
    which also means pretty much all commands now handle divergent commits.

  • Inject will now copy the author, timestamp and message into the new commit.

  • The oplog now combines the operation show, diff and historic log views.

  • The default set of revisions for the jj-fzf log list is now
    jj-fzf.log_revset with a fallback of revsets.log (the standard jj log
    revset). To use a different revset with jj-fzf, type the revset into the
    query field for live revset updates. To persist the revset in the repo
    config under jj-fzf.log_revset, hit Alt-Enter.

  • The default commit display template for the jj-fzf log list is now
    jj-fzf.log_template with a fallback of templates.log (the standard jj
    log template). In order to configure jj-fzf for one line display, use:
    jj config set --user jj-fzf.log_template builtin_log_oneline

  • Alt-B now presents a dialog to create, move, delete or track bookmarks and
    delete tags. The former bookmark deletion under Alt-D has been merged into
    Alt-B.

  • Alt-Q will now squash changes from selected revisions into the revision
    under the pointer, or into the parent if no revisions are selected.

  • Alt-S now starts jj restore --interactive and restores files from a single
    selected revision into the revision under the pointer, or into the parent
    if no revisions are selected.

  • Ctrl-D will pre-generate a commit message for merge commits only. For normal
    commit messages, use templates.draft_commit_description instead. If you
    depend on the messages of previous jj-fzf versions, consider the hint printed
    out by: lib/draft.sh --hint
    See also: https://jj-vcs.github.io/jj/latest/config/#default-description

  • Ctrl-F now toggles between the fzf finder and live revset editing.
    There is no key binding replacement for the old 'file-editor', just run
    jj edit or jj new on an old commit and open the file of interest.

  • Ctrl-L will now either show the history up to a single selected revision,
    or for the selected (multiple) revisions only.

  • Ctrl-V is the new key binding for the evolution log browser.

  • An LLM can be used to generate commit messages with the Ctrl-S key binding.
    The generated message is provided to jj describe as a config value in
    template-aliases.default_commit_description.
    See the manual page for LLM configurations via environment variables.

  • Sub-dialogs like rebase, reparent or even bookmarks should now retain the
    commit (bookmark) pointer position.

  • An optimal column-major text layout algorithm now presents the key bindings.

  • The CI now runs and validates a selected set of screencasts.

  • New -c +c -r +r -s options allow using jj-fzf as a picker for 1 or many
    commits, 1 or many revisions or a revset expression.

Changed:

  • Bookmarks are now display with a simplified state that indicates:
    Deleted / Conflicted / Tracked / Untracked / Local Remote

  • On startup jj-fzf now offers revset editing in the query field.
    Use Ctrl-F for the fzf filter.

  • When running jj describe a $EDITOR wrapper is used that prevents jj
    from accepting an auto-generated default description as message.

  • Running a command from jj-fzf switches back from the alternative screen
    and will reload the entire jj log output before returning. This may
    take longer than the async log loading in previous versions, but it
    allows fzf to track and keep the current pointer position.

Fixed:

  • The man page now list key bindings for jj-fzf and all sub-commands.

  • A new configuration section in the man page describes config keys that
    jj-fzf makes use of, as well as how to configure LLM usage.

  • The push command now avoids querying if nothing changed.

Breaking:

  • The minimum supported fzf version is now 0.65.2.

  • This release requires jj-0.34.0

  • Commands missing from the rewrite:

    • Alt-V: vivifydivergent - use jj metaedit --update-change-id
    • Ctrl-A: author-reset - use jj metaedit --update-author
    • Ctrl-I: diff - should be handled by Ctrl-L now
    • Ctrl-V: gitk - not provided anymore
    • Ctrl-W: wb-diff - toggle ±b ±w for diff
  • A number of changes listed above could be considered breaking old
    workflows. Please provide feedback in Github discussions or IRC
    if you encounter regressions or miss important features.

Thanks to everyone who gave feedback regarding the rewrite and
helped to make this release happen!

Full Changelog: v0.33.0...v0.34.0

JJ-FZF 0.33.0

10 Sep 22:24

Choose a tag to compare

JJ-FZF 0.33.0 - 2025-09-11

Added:

  • New preflight.sh script dedicated to dependency handling
  • Added version.sh to support Github "Source code" archives
  • Added self extracting jj-fzf.sfx script to release artifacts
  • Added manual page jj-fzf.1.gz to release artifacts
  • Added contrib/jj-foreach.sh to run shell command for each commit in a revset
  • Added option to contrib/jj-foreach.sh to not affecting descendants
  • Alt-J: inject selected revision as historic commit before @
  • Documented F5 and F11 keybindings

Breaking:

  • This release requires jj-0.33.0
  • This release is the last one to support fzf 0.44.1, future release
    will depend on more recent fzf versions
  • Upon start, fzf will now wait for jj log to finish before display; if this
    turns out too slow for some repos, please file an issue and request --async
  • Instead of enforcing gsed use, preflight.sh now defines an sed() function
    that proxies gsed if needed. Please file an issue if sed problems remain

Changed:

  • Pushing to a remote will now also push deleted bookmarks
  • Preserve history when deleting tags or bookmarks
    (enforces git.abandon-unreachable-commits=false during deletion)
  • Added cursor down to swap-commits to follow swapped commit
  • Moved preview and helper into library files (speeds up previews)
  • Undo/redo operations in jj-fzf now use jj's built-in commands
  • Use jj-fzf oplog to display the undo stack with ⋯ undo step markers
  • Renamed oplog and oplog-browser commands

Fixed:

  • Fixed evolog preview and evolog paging (was broken since jj-0.30)
  • Fixed outdated uses of jj --config-toml
  • Fixed broken Github jj-fzf links
  • Fixed lacking DESTDIR for make (un)install

Removed:

  • Removed unnecessary all: prefix in jj revset expressions
  • Removed unsed command / key binding for undo marker reset

Full Changelog: v0.32.0...v0.33.0

JJ-FZF 0.32.0.nightly2508160046

16 Aug 00:47

Choose a tag to compare

Pre-release

JJ-FZF 0.32.0.nightly2508160046

Development version - may contain bugs or compatibility issues.

.github/workflows/testing.yml: update artifact name in GitHub workflow    # 2025-08-16 Tim Janik 7f2c4ec

.github/workflows/testing.yml: add build step for self-extracting jj-fzf.sfx    # 2025-08-16 Tim Janik 9360e32

Makefile.mk: add Makefile rule to build self-extracting archive for jj-fzf    # 2025-08-16 Tim Janik cb67fb8
    This commit introduces a new Makefile rule to generate a self-extracting
    archive (SFX) for jj-fzf. The SFX archive bundles the jj-fzf script with
    all its installation files into a single executable shell script.

sfx.sh: add self-extracting shell script generator    # 2025-08-16 Tim Janik 5f0f8bb
    This commit introduces sfx.sh, a self-extracting shell script utility that
    packs a binary executable and its dependencies into a single, self-contained
    shell script. The script embeds a tarball containing all necessary files,
    which is extracted at runtime into a temporary directory. The embedded
    script then executes the packed binary from that temporary location.

Makefile.mk: add `artifacts` to `CLEANDIRS`    # 2025-08-16 Tim Janik 48926a7

Full Changelog: v0.32.0...v0.32.0.nightly2508160046

JJ-FZF 0.32.0

14 Aug 01:45

Choose a tag to compare

JJ-FZF 0.32.0 - 2025-08-14

Added:

  • Ctrl-W: Added way to toggle between various diff formats
  • Alt+M: New multi-select mode, use TAB to select multiple commits
  • Added multi-mode support for abandon, backout, duplicate, squash, rebase
  • Added make distcheck, always check in CI
  • Added check for jj-fzf --help
  • Added installcheck rule
  • Added separate manual page
  • Added file summary to oplog history
  • Added scripts to automate releases
  • Added contirb/suspend-with-shell.el to run jj-fzf from emacs, see:
    https://testbit.eu/2025/jj-fzf-in-emacs

Breaking:

  • Depend on jj-0.32.0
  • Changed Alt-N to run new-after with --no-edit
  • Preserve PWD in subshells if possible (present)
  • Remove unused 'merging' command

Changed:

  • To install, run make all install
  • To run all checks, run make all check install installcheck
  • Builds require GNU Make
  • Moved version checks for all tool dependencies into Makefile
  • Use /usr/bin/env to find bash
  • Undeprecate Alt-S: restore-file from selected revision
  • Build man page, use a man page browser for jj-fzf --help
  • Fetch version information from Git
  • Automatically run CI for PRs and tags
  • Introduced pandoc dependency for man builds

Fixed:

  • Fixed installations not working in non-jj repos
  • Fixed --version not working outside a jj repo

Full Changelog: v0.25.0...v0.32.0

JJ-FZF 0.25.0.nightly2507310040

31 Jul 00:41

Choose a tag to compare

Pre-release

JJ-FZF 0.25.0.nightly2507310040

Development version - may contain bugs or compatibility issues.

.github/workflows/gh-release.sh: add script to create github releases    # 2025-07-31 Tim Janik a07fa3d
    .github/workflows/gh-release.sh: add recent git log for prereleases
    .github/workflows/gh-release.sh: script to create github releases
    .github/workflows/testing.yml: fix release title

Merge branch 'distcheck-in-ci'    # 2025-07-31 Tim Janik a738119
    * Branch commit log:
      .github/workflows/testing.yml: run CI for PRs and tags
      .github/workflows/testing.yml: upload artifacts/, add CreateRelease
      Makefile.mk: fix ChangeLog and tarball location
      .gitignore: updates
      .github/workflows/testing.yml: add distcheck to CI, upload tarball
      Makefile.mk: add `make distcheck`
      Makefile.mk: reorder & cleanup
      .github/workflows/testing.yml: install jj and fzf in usr/local
      .github/workflows/testing.yml: use sudo for make install
      .github/workflows/testing.yml: install pandoc for man builds

Merge branch 'makefile-version-checks'    # 2025-07-30 Tim Janik ac769d5
    * Branch commit log:
      tests/utils.sh: use `jj-fzf --version` as minimal test
      Makefile.mk: move version checks for all needed tools into makefile
      Makefile.mk: let install depend on all (build artifacts and checks)
      .github/workflows/testing.yml: add installcheck to CI
      Makefile.mk: give `jj-fzf --help-bindings` a .jj repo to run in
      Makefile.mk: add check for jj-fzf --help
      Makefile.mk: add installcheck

Merge branch 'separate-manual-page'    # 2025-07-30 Tim Janik b835b32
    * Branch commit log:
      Makefile.mk: add clean rule
      Makefile.mk: use env to run bash
      jj-fzf: handle --version early on, use man for --help
      Makefile.mk: build man page
      doc/jj-fzf.1.md: split manual page out of jj-fzf
      .gitignore: updates

Merge branch 'versioned-install'    # 2025-07-30 Tim Janik 79a6448
    * Branch commit log:
      Makefile.mk: install version.sh next to jj-fzf, hardcode git version
      jj-fzf: introduce ABSPATHSCRIPT, use version.sh
      version.sh: fetch version from git unless hardcoded
      Makefile.mk, GNUmakefile: rename, support via GNU make include
      .gitignore: ignore temporary files

Makefile.mk: install version.sh next to jj-fzf, hardcode git version    # 2025-07-30 Tim Janik 017fa98

jj-fzf: introduce ABSPATHSCRIPT, use version.sh    # 2025-07-30 Tim Janik a64d16c

version.sh: fetch version from git unless hardcoded    # 2025-07-30 Tim Janik 7a7f1ee

Makefile.mk, GNUmakefile: rename, support via GNU make include    # 2025-07-30 Tim Janik 8863432

.gitignore: ignore temporary files    # 2025-07-30 Tim Janik c7bf25b

Merge branch 'simpler-new-after-and-before'    # 2025-07-30 Tim Janik 456081a
    * Branch commit log:
      jj-fzf: fix comment
      jj-fzf: change Alt-N to run new-after
    	The new-before function is now available under Ctrl-Alt-N.
    	BREAKING: Use Alt-N Alt-X to run new-after and swap commits to it is ordered *before* the target commit.
    	BREAKING: The new-after and new-before are now creating new commits with --no-edit, use Ctrl-e instead.
      .github/workflows/testing.yml: install jj-0.31 for CI

Merge branch 'multi-select'    # 2025-07-30 Tim Janik c3e28cc
    * Branch commit log:
      jj-fzf: undo: allow working in multi-select mode
      jj-fzf: squash-into-parent: add multi-select support
      jj-fzf: rebase: add multi-select support for rebase and duplicate operations
    	BREAKING: The default rebase mode is now --source, use Alt-B to select --branch.
      jj-fzf: backout: add multi-select support
    	BREAKING: The working copy is now *not* adjusted after creating the backout commit.
    	This mirrors the plain `jj backout` behavior.
      jj-fzf: abandon: add multi-select support
      jj-fzf: remove unused 'merging' command
    	BREAKING: Use `jj new` and `jj bookmark set trunk` instead.
      jj-fzf: add multiselect support for batch operations on revisions
      jj-fzf: depend on jj-0.31.0

jj-fzf: undo: allow working in multi-select mode    # 2025-07-30 Tim Janik a69ea1e

jj-fzf: squash-into-parent: add multi-select support    # 2025-07-30 Tim Janik 5c853fb

jj-fzf: rebase: add multi-select support for rebase and duplicate operations    # 2025-07-30 Tim Janik 9e617a3
    BREAKING: The default rebase mode is now --source, use Alt-B to select --branch.

jj-fzf: backout: add multi-select support    # 2025-07-30 Tim Janik e9ccb89
    BREAKING: The working copy is now *not* adjusted after creating the backout commit.
    This mirrors the plain `jj backout` behavior.

jj-fzf: abandon: add multi-select support    # 2025-07-30 Tim Janik bad8dae

jj-fzf: remove unused 'merging' command    # 2025-07-30 Tim Janik 8004d9c
    BREAKING: Use `jj new` and `jj bookmark set trunk` instead.

jj-fzf: add multiselect support for batch operations on revisions    # 2025-07-30 Tim Janik 2d30f54

jj-fzf: depend on jj-0.31.0    # 2025-07-30 Tim Janik 85e64d4

Merge branch 'oplog-file-summary'    # 2025-07-04 Tim Janik 74e16eb
    * Branch commit log:
      jj-fzf: add file summary to oplog history
      .gitignore: ignore .x*

Merge branch 'preserve-pwd'    # 2025-05-28 Tim Janik 7aacc56
    * Branch commit log:
      jj-fzf: preserve PWD in subshells if possible
      .gitignore: updates

Merge branch 'suspend-with-shell-for-jj-fzf'    # 2025-01-30 Tim Janik 501a936
    * Branch commit log:
      README.md: describe contirb/suspend-with-shell.el
      contrib/suspend-with-shell.el: use (suspend-emacs) to run a custom command
    	This works without use of `ioctl(TIOCSTI)` that (suspend-emacs) relies on

Merge branch 'ctrl-w-diff-formats'    # 2025-01-30 Tim Janik 57cf5eb
    * Branch commit log:
      jj-fzf: add Ctrl-W to toggle between various diff formats
    	* Use git-diff to implement --git and --word-diff, because it produces diffs with hunk-header
    	* Move temp_dir() which might be required for previews now
    	* Use $SILENTEXECS for execute-silent
      jj-fzf: get rid of $JJFZF_ATOP uses
      jj-fzf: Alt-S: restore-file from selected revision or working copy

Full Changelog: v0.25.0...v0.25.0.nightly2507310040

0.25.0

23 Jan 02:50

Choose a tag to compare

JJ-FZF 0.25.0 - 2025-01-23

Added:

  • Fzflog: use jjlog unless jj-fzf.fzflog-depth adds bookmark ancestry
  • Use author.email().local(), required by jj-0.25
  • Absorb: unconditionally support absorb
  • Evolog: add Alt-J to inject a historic commit
  • Evolog: add Enter to browse detailed evolution with patches
  • Add Ctrl-T evolog dialog with detailed preview
  • Add content-diff to jj describe
  • Add ui.default-description to commit messages
  • Display 'private' as a flag in preview
  • Add jj-am.sh to apply several patches in email format
  • Add jj-undirty.el, an elisp hook to auto-snapshot after saving emacs buffers

Changed:

  • Always cd to repo root, so $PWD doesn't vanish
  • Adjust Makefile to work with macOS, #6
  • Merging: prefer (master|main|trunk) as UPSTREAM
  • Make sure to use gsed
  • Check-gsed: show line numbers
  • Echo_commit_msg: strip leading newline from ui.default-description
  • Flags: display hidden, divergent, conflict
  • Cut off the preview after a few thausand lines
  • Split-files: try using jj diff instead of git diff-tree
  • Use JJ_EDITOR to really override th JJ editor settings
  • Honor the JJ_EDITOR precedence
  • Show content diff when editing commit message
  • Adjust Bookmark, Commit, Change ID descriptions
  • Display 'immutable' as a flag in preview
  • Fzflog: silence deprecation warnings on stderr
  • Include fzflog error messages in fzf input if any
  • Unset FZF_DEFAULT_COMMAND in subshells

Fixed:

  • Fix RESTORE-FILE title
  • Properly parse options --help, --key-bindings, --color=always
  • Echo_commit_msg: skip signoff if no files changed

Deprecation:

  • Deprecate Alt-S for restore-file
  • Deprecate Ctrl-V for gitk

Breaking:

  • Depend on jj-0.25.0
  • Op-log: use Alt-J to inject an old working copy as historic commit
  • Alt-Z: subshells will always execute in the repository root dir

Full Changelog: v0.24.0...v0.25.0

Contributors

Thanks to everyone who made this release happen!

jj-fzf 0.24.0

12 Dec 13:57

Choose a tag to compare

JJ-FZF 0.24.0

Added:

  • Added Alt-O: Absorb content diff into mutable ancestors
  • Added jj op show -p as default op log preview (indicates absorbed changes)
  • Added marker based multi-step undo which improved robustness
  • Op-log: Added restore (Alt-R), undo memory reset (Alt-K) and op-diff (Ctrl-D)
  • Added RFC-1459 based simple message IRC bot for CI notifications
  • Added checks for shellcheck-errors to CI
  • Creating a Merge commit can now automatically rebase (Alt-R) other work
  • Added duplicate (Alt-D) support to rebase (including descendants)
  • Added auto-completion support to bookmarks set/move (Alt-B)
  • Reparenting: added Alt-P to simplify-parents after jj rebase
  • Implemented faster op log preview handling
  • New config jj-fzf.fzflog-depth to increase fzflog depth
  • Ctrl-I: add diff browser between selected revision and working copy
  • F5: trigger a reload (shows concurrent jj repo changes)
  • Support rebase with --ignore-immutable via Alt-I
  • Implement adaptive key binding display (Alt-H)
  • Ctrl-H: show extended jj-fzf help via pager
  • Broadened divergent commit support: squash-into-parent, describe, log
  • Started adding unit tests and automated unit testing in CI
  • Introduced Makefile with rules to check, install, uninstall

Breaking:

  • Depend on jj-0.24.0 and require fzf-0.43.0
  • Removed Alt-U for jj duplicate, use rebase instead: Alt-R Alt-D
  • Assert that bash supports interactive mode with readline editing
  • Check-deps: check dependencies before installing
  • Rebase: rename rebasing to jj-fzf rebase
  • Rebase: apply simplify-parents to the rebased revision only
  • Rename 'edit' (from 'edit-workspace')
  • Rename revset-assign → revset-filter
  • Op-log: Ctrl-S: Preview "@" at a specific operation via jj show @
    (formerly Ctrl-D)
  • If you are significantly affected by an item in the breaking changes list,
    please provide feedback, e.g. via IRC, email, Github issues or discussions.

Changed:

  • Avoid JJ_CONFIG overrides in all places
  • Support ui.editor, ui.diff-editor and other settings
  • Squash-into-parent: use jj new -A to preserve change_id
  • Jump to first when reparenting and after rebase
  • Ctrl-P: jj git fetch default remote, not all
  • Support deletion of conflicted bookmarks
  • Line Blame: skip signoff and empty lines

Fixed:

  • Avoid slowdowns during startup
  • Fixed some cases of undesired snapshotting
  • Lots of fixes and improvements to allow automated testing
  • Minor renames to make shellcheck happy
  • Log: Ctrl-L: fix missing patch output
  • Ensure jj log view change_id width matches jj log default width

See also jj-fzf --help or the wiki page jj-fzf-help for detailed descriptions.

Full Changelog: v0.23.0...v0.24.0

v0.23.0

12 Nov 03:46

Choose a tag to compare

JJ-FZF 0.23.0

Development version - may contain bugs or compatibility issues.

Breaking:

  • Depend on jj-0.23.0
  • Remove experimental line-history command

Added:

  • Support 'gsed' as GNU sed binary name
  • Support line blame via: jj-fzf +
  • Support '--version' to print version
  • Define revset jjlog to match jj log
  • Define revset fzflog as jjlog + tags + bookmarks
  • Display jj log -r fzflog revset by default
  • Store log revset in --repo jj-fzf.revsets.log
  • Ctrl-R: reload log with new revset from query string

Changed:

  • Require 'gawk' as GNU awk binary
  • Ctrl-Z: use user's $SHELL to execute a subshell
  • Shorten preview diffs with --ignore-all-space
  • Show error with delay after failing jj commands
  • Restore-file: operate on root relative file names
  • Split-files: operate on root relative file names
  • Fallback to @ if commands are called without a revision
  • Allow user's jj config to take effect in log display
  • Unset JJ_CONFIG in Ctrl+Z subshell
  • Rebase: Alt-P: toggle simplify-parents (off by default)
  • Reduce uses of JJ_CONFIG (overrides user configs)

Fixed:

  • Split-files: use Git diff-tree for a robust file list
  • Ensure that internal sub-shell is bash to call functions, #1
  • Clear out tags in screencast test repo
  • Various smaller bug fixes
  • Add missing --ignore-working-copy in some places
  • Fix git_head() expression for jj-0.23.0

Removed:

  • Remove unused color definitions
  • Skip explicit jj git import/export statements
  • Skip remove-parent in screencast, use simplify-parents

Contributors

Thanks to everyone who made this release happen!

v0.22.0

05 Nov 14:45

Choose a tag to compare

Full Changelog: v0.0.0...v0.22.0

First project release, depending on jj-0.22.0, including the following commands:

  • Alt-A: abandon
  • Alt-B: bookmark
  • Alt-C: commit
  • Alt-D: delete-refs
  • Alt-E: diffedit
  • Alt-F: split-files
  • Alt-I: split-interactive
  • Alt-K: backout
  • Alt-L: line-history
  • Alt-M: merging
  • Alt-N: new-before
  • Alt-P: reparenting
  • Alt-Q: squash-into-parent
  • Alt-R: rebasing
  • Alt-S: restore-file
  • Alt-T: tag
  • Alt-U: duplicate
  • Alt-V: vivifydivergent
  • Alt-W: squash-@-into
  • Alt-X: swap-commits
  • Alt-Z: undo
  • Ctrl-↑: preview-up
  • Ctrl-↓: preview-down
  • Ctrl-A: author-reset
  • Ctrl-D: describe
  • Ctrl-E: edit-workspace
  • Ctrl-F: file-editor
  • Ctrl-H: help
  • Ctrl-L: log
  • Ctrl-N: new
  • Ctrl-O: op-log
  • Ctrl-P: push-remote
  • Ctrl-T: toggle-evolog
  • Ctrl-U: clear-filter
  • Ctrl-V: gitk

See jj-fzf --help or the wiki page jj-fzf-help for detailed descriptions.