fzf-git.sh

August 31, 2025 ยท View on GitHub

bash, zsh, and fish key bindings for Git objects, powered by fzf.

image

Each binding will allow you to browse through Git objects of a certain type, and select the objects you want to paste to your command-line.

Installation

  • Install the latest version of fzf
    • (Optional) Install bat for syntax-highlighted file previews
    • Git v2.42.0 or later is required for the git for-each-ref binding
  • Update your shell configuration file
    • bash or zsh
      • Source fzf-git.sh file from your .bashrc or .zshrc
    • fish

Usage

List of bindings

  • CTRL-G? to show this list
  • CTRL-GCTRL-F for Files
  • CTRL-GCTRL-B for Branches
  • CTRL-GCTRL-T for Tags
  • CTRL-GCTRL-R for Remotes
  • CTRL-GCTRL-H for commit Hashes
  • CTRL-GCTRL-S for Stashes
  • CTRL-GCTRL-L for reflogs
  • CTRL-GCTRL-W for Worktrees
  • CTRL-GCTRL-E for Each ref (git for-each-ref)

Warning

You may have issues with these bindings in the following cases:

  • CTRL-GCTRL-B will not work if CTRL-B is used as the tmux prefix
  • CTRL-GCTRL-S will not work if flow control is enabled, CTRL-S will freeze the terminal instead
    • (stty -ixon will disable it)

To workaround the problems, you can use CTRL-G{key} instead of CTRL-GCTRL-{KEY}.

Warning

If zsh's KEYTIMEOUT is too small (e.g. 1), you may not be able to hit two keys in time.

Inside fzf

  • TAB or SHIFT-TAB to select multiple objects
  • CTRL-/ to change preview window layout
  • CTRL-O to open the object in the web browser (in GitHub URL scheme)

Customization

# Redefine this function to change the options
_fzf_git_fzf() {
  fzf --height 50% --tmux 90%,70% \
    --layout reverse --multi --min-height 20+ --border \
    --no-separator --header-border horizontal \
    --border-label-pos 2 \
    --color 'label:blue' \
    --preview-window 'right,50%' --preview-border line \
    --bind 'ctrl-/:change-preview-window(down,50%|hidden|)' "$@"
}

Defining shortcut commands

Each binding is backed by _fzf_git_* function so you can do something like this in your shell configuration file.

gco() {
  _fzf_git_each_ref --no-multi | xargs git checkout
}

gswt() {
  cd "$(_fzf_git_worktrees --no-multi)"
}

Environment Variables

VariableDescriptionDefault
BAT_STYLESpecifies the style for displaying files using batfull
FZF_GIT_CATDefines the preview command used for displaying the filebat --style=$BAT_STYLE --color=$FZF_GIT_COLOR
FZF_GIT_COLORSet to never to suppress colors in the listalways
FZF_GIT_PAGERSpecifies the pager command for the preview window$(git config --get core.pager)
FZF_GIT_PREVIEW_COLORSet to never to suppress colors in the preview windowalways