FORGIT(1)

NAME

forgit:zzz: A utility tool powered by fzf for using git interactively.

SYNOPSIS

$brew install forgit

INFO

5.0k stars
156 forks
0 views

DESCRIPTION

:zzz: A utility tool powered by fzf for using git interactively.

README

💤 forgit

Utility tool for using git interactively. Powered by junegunn/fzf.

pre-commit Contributors

This tool is designed to help you use git more efficiently. It's lightweight and easy to use.

📥 Installation

Requirements

  • fzf version 0.49.0 or higher

    If your OS package manager bundles an older version of fzf, you might install it using fzf's own install script'.

Shell package managers

# for zplug
zplug 'wfxr/forgit'

for zgen

zgen load 'wfxr/forgit'

for antigen

antigen bundle 'wfxr/forgit'

for fisher (requires fisher v4.4.3 or higher)

fisher install wfxr/forgit

for omf

omf install https://github.com/wfxr/forgit

for zinit

zinit load wfxr/forgit

for oh-my-zsh

git clone https://github.com/wfxr/forgit.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/forgit

for sheldon.cli

[plugins.forgit] github = "wfxr/forgit" rev = "25.02.0" use = ["forgit.plugin.zsh"] apply = ["source"]

manually

Clone the repository and source it in your shell's rc file or put bin/git-forgit into your $PATH

Homebrew

To install using brew

brew install forgit

Then add the following to your shell's config file:

# Fish:
# ~/.config/fish/config.fish:
[ -f $HOMEBREW_PREFIX/share/forgit/forgit.plugin.fish ]; and source $HOMEBREW_PREFIX/share/forgit/forgit.plugin.fish

Zsh:

~/.zshrc:

[ -f $HOMEBREW_PREFIX/share/forgit/forgit.plugin.zsh ] && source $HOMEBREW_PREFIX/share/forgit/forgit.plugin.zsh

Bash:

~/.bashrc:

[ -f $HOMEBREW_PREFIX/share/forgit/forgit.plugin.sh ] && source $HOMEBREW_PREFIX/share/forgit/forgit.plugin.sh

Arch User Repository

AUR packages, maintained by the developers of forgit, are available. Install the forgit package for the latest release or forgit-git to stay up to date with the latest commits from the default branch of this repository.

Completions

Forgit offers completions for all supported shells. Completions are automatically configured when installing forgit through Homebrew or the AUR. All other installation methods mentioned above require manual setup for completions. The necessary steps depend on the shell you use.

Bash

  • Put completions/git-forgit.bash in ~/.local/share/bash-completion/completions to have bash tab completion for git forgit and configured git aliases.
  • Source completions/git-forgit.bash explicitly to have bash tab completion for forgit shell functions and aliases (e.g., gsw <tab> completes branches).

Fish

  • Put completions/git-forgit.fish in ~/.config/fish/completions/ to have fish tab completion for git forgit and configured git aliases, as well as shell command aliases, such as ga.

Zsh

  • Put completions/_git-forgit in a directory in your $fpath (e.g., /usr/share/zsh/site-functions) to have zsh tab completion for git forgit and configured git aliases, as well as shell command aliases, such as forgit::add and ga.

If you're having issues after updating, and commands such as forgit::add or aliases ga aren't working, remove your completions cache and restart your shell.

> rm ~/.zcompdump
> zsh

📝 Features

  • Interactive git add selector (ga)

screenshot

  • Interactive git log viewer (glo)

screenshot

The log graph can be disabled by option FORGIT_LOG_GRAPH_ENABLE (see discuss in issue #71).

  • Interactive .gitignore generator (gi)

screenshot

  • Interactive git diff viewer (gd)

  • Interactive git show viewer (gso)

  • Interactive git reset HEAD <file> selector (grh)

  • Interactive git checkout <file> selector (gcf)

  • Interactive git checkout <branch> selector (gcb)

  • Interactive git switch <branch> selector (gsw)

  • Interactive git branch -D <branch> selector (gbd)

  • Interactive git checkout <tag> selector (gct)

  • Interactive git checkout <commit> selector (gco)

  • Interactive git revert <commit> selector (grc)

  • Interactive git stash viewer (gss)

  • Interactive git stash push selector (gsp)

  • Interactive git clean selector (gclean)

  • Interactive git cherry-pick selector (gcp)

  • Interactive git rebase -i selector (grb)

  • Interactive git reflog viewer (grl)

  • Interactive git blame selector (gbl)

  • Interactive git commit --fixup && git rebase -i --autosquash selector (gfu)

  • Interactive git commit --squash && git rebase -i --autosquash selector (gsq)

  • Interactive git commit --fixup=reword && git rebase -i --autosquash selector (grw)

⌨ Keybindings

KeyAction
EnterConfirm
TabToggle mark and move down
Shift - TabToggle mark and move up
?Toggle preview window
Alt - WToggle preview wrap
Ctrl - SToggle sort
Ctrl - RToggle selection
Ctrl - YCopy commit hash/stash ID*
Ctrl - K / PSelection move up
Ctrl - J / NSelection move down
Alt - K / PPreview move up
Alt - J / NPreview move down
Alt - EOpen file in default editor (when possible)

* Available when the selection contains a commit hash or a stash ID. For Linux users FORGIT_COPY_CMD should be set to make copy work. Example: FORGIT_COPY_CMD='xclip -selection clipboard'.

⚙ Options

Options can be set via environment variables. They have to be exported in order to be recognized by forgit.

For instance, if you want to order branches in gcb by the last committed date you could:

export FORGIT_CHECKOUT_BRANCH_BRANCH_GIT_OPTS='--sort=-committerdate'

shell aliases

You can change the default aliases by defining these variables below before sourcing the forgit shell plugin. (To disable all aliases, Set the FORGIT_NO_ALIASES flag.)

forgit_log=glo
forgit_reflog=grl
forgit_diff=gd
forgit_show=gso
forgit_add=ga
forgit_reset_head=grh
forgit_ignore=gi
forgit_attributes=gat
forgit_checkout_file=gcf
forgit_checkout_branch=gcb
forgit_switch_branch=gsw
forgit_branch_delete=gbd
forgit_checkout_tag=gct
forgit_checkout_commit=gco
forgit_revert_commit=grc
forgit_clean=gclean
forgit_stash_show=gss
forgit_stash_push=gsp
forgit_cherry_pick=gcp
forgit_rebase=grb
forgit_blame=gbl
forgit_fixup=gfu
forgit_squash=gsq
forgit_reword=grw

git integration

You can use forgit as a sub-command of git by making git-forgit available in $PATH:

# after `forgit` was loaded
PATH="$PATH:$FORGIT_INSTALL_DIR/bin"

Some plugin managers can help do this.

Then, any forgit command will be a sub-command of git:

git forgit log
git forgit add
git forgit diff

Optionally you can add aliases in git:

git config --global alias.cf 'forgit checkout_file'

And use forgit functions via a git alias:

git cf

git options

If you want to customize git's behavior within forgit there is a dedicated variable for each forgit command. These are passed to the according git calls.

CommandOption
gaFORGIT_ADD_GIT_OPTS
gloFORGIT_LOG_GIT_OPTS
grlFORGIT_REFLOG_GIT_OPTS
gdFORGIT_DIFF_GIT_OPTS
gsoFORGIT_SHOW_GIT_OPTS
grhFORGIT_RESET_HEAD_GIT_OPTS
gcfFORGIT_CHECKOUT_FILE_GIT_OPTS
gcbFORGIT_CHECKOUT_BRANCH_GIT_OPTS, FORGIT_CHECKOUT_BRANCH_BRANCH_GIT_OPTS
gswFORGIT_SWITCH_BRANCH_GIT_OPTS
gbdFORGIT_BRANCH_DELETE_GIT_OPTS
gctFORGIT_CHECKOUT_TAG_GIT_OPTS
gcoFORGIT_CHECKOUT_COMMIT_GIT_OPTS
grcFORGIT_REVERT_COMMIT_GIT_OPTS
gssFORGIT_STASH_SHOW_GIT_OPTS
gspFORGIT_STASH_PUSH_GIT_OPTS
gcleanFORGIT_CLEAN_GIT_OPTS
grbFORGIT_REBASE_GIT_OPTS
gblFORGIT_BLAME_GIT_OPTS
gfuFORGIT_FIXUP_GIT_OPTS
gsqFORGIT_SQUASH_GIT_OPTS
grwFORGIT_REWORD_GIT_OPTS
gcpFORGIT_CHERRY_PICK_GIT_OPTS

pagers

Forgit will use the default configured pager from git (core.pager, pager.show, pager.diff) but can be altered with the following environment variables:

Use caseOptionFallbacks to
common pagerFORGIT_PAGERgit config core.pager or cat
pager on git showFORGIT_SHOW_PAGERgit config pager.show or $FORGIT_PAGER
pager on git diffFORGIT_DIFF_PAGERgit config pager.diff or $FORGIT_PAGER
pager on git blameFORGIT_BLAME_PAGERgit config pager.blame or $FORGIT_PAGER
pager on gitignoreFORGIT_IGNORE_PAGERbat -l gitignore --color always or cat
pager on gitatrributesFORGIT_ATTRIBUTES_PAGERbat -l gitattributes --color always or cat
git log formatFORGIT_GLO_FORMAT%C(auto)%h%d %s %C(black)%C(bold)%cr%reset

fzf options

You can add default fzf options for forgit, including keybindings, layout, etc. (No need to repeat the options already defined in FZF_DEFAULT_OPTS)

export FORGIT_FZF_DEFAULT_OPTS="
--exact
--border
--cycle
--reverse
--height '80%'
"

Customizing fzf options for each command individually is also supported:

CommandOption
gaFORGIT_ADD_FZF_OPTS
gloFORGIT_LOG_FZF_OPTS
grlFORGIT_REFLOG_FZF_OPTS
giFORGIT_IGNORE_FZF_OPTS
gatFORGIT_ATTRIBUTES_FZF_OPTS
gdFORGIT_DIFF_FZF_OPTS
gsoFORGIT_SHOW_FZF_OPTS
grhFORGIT_RESET_HEAD_FZF_OPTS
gcfFORGIT_CHECKOUT_FILE_FZF_OPTS
gcbFORGIT_CHECKOUT_BRANCH_FZF_OPTS
gswFORGIT_SWITCH_BRANCH_FZF_OPTS
gbdFORGIT_BRANCH_DELETE_FZF_OPTS
gctFORGIT_CHECKOUT_TAG_FZF_OPTS
gcoFORGIT_CHECKOUT_COMMIT_FZF_OPTS
grcFORGIT_REVERT_COMMIT_FZF_OPTS
gssFORGIT_STASH_FZF_OPTS
gspFORGIT_STASH_PUSH_FZF_OPTS
gcleanFORGIT_CLEAN_FZF_OPTS
grbFORGIT_REBASE_FZF_OPTS
gblFORGIT_BLAME_FZF_OPTS
gfuFORGIT_FIXUP_FZF_OPTS
gsqFORGIT_SQUASH_FZF_OPTS
grwFORGIT_REWORD_FZF_OPTS
gcpFORGIT_CHERRY_PICK_FZF_OPTS

Complete loading order of fzf options is:

  1. FZF_DEFAULT_OPTS (fzf global)
  2. FORGIT_FZF_DEFAULT_OPTS (forgit global)
  3. FORGIT_CMD_FZF_OPTS (command specific)

Examples:

  • ctrl-d to drop the selected stash but do not quit fzf (gss specific).
export FORGIT_STASH_FZF_OPTS='
--bind="ctrl-d:reload(git stash drop $(cut -d: -f1 <<<{}) 1>/dev/null && git stash list)"
'
  • ctrl-e to view the logs in a vim buffer (glo specific).
export FORGIT_LOG_FZF_OPTS='
--bind="ctrl-e:execute(echo {} |grep -Eo [a-f0-9]+ |head -1 |xargs git show |vim -)"
'

other options

OptionDescriptionDefault
FORGIT_LOG_FORMATgit log format%C(auto)%h%d %s %C(black)%C(bold)%cr%Creset
FORGIT_PREVIEW_CONTEXTlines of diff context in preview mode3
FORGIT_FULLSCREEN_CONTEXTlines of diff context in full-screen mode10
FORGIT_DIR_VIEWcommand used to preview directoriestree if available, otherwise find
FORGIT_CLEAN_LIST_FILES_OPTSarguments passed to git ls-files together with --others to determine which files are shown when invoking forgit clean

📦 Optional dependencies

  • delta / diff-so-fancy: For better human-readable diffs.

  • bat: Syntax highlighting for gitignore and gitattributes.

  • emoji-cli: Emoji support for git log.

  • tree: Directory tree view for gclean.

💡 Tips

  • Most of the commands accept optional arguments (e.g., glo develop, glo f738479..188a849b -- main.go, gco main).
  • gd supports specifying revision(e.g., gd HEAD~, gd v1.0 README.md).
  • Call gi or gat with arguments to get the wanted .gitignore/.gitattributes contents directly(e.g., gi cmake c++).

📃 License

MIT (c) Wenxuan Zhang

SEE ALSO

clihub3/4/2026FORGIT(1)