forgit
💤 forgit
Utility tool for using git interactively. Powered by junegunn/fzf.
This tool is designed to help you use git more efficiently.
It’s lightweight and easy to use.
📥 Installation
Make sure you have fzf
installed.
# 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 # manually # Clone the repository and source it in your shell's rc file or put bin/git-forgit into your $PATH
Fig
Fig adds apps, shortcuts, and autocomplete to your existing terminal.
Install forgit
in just one click.
📝 Features
-
Interactive
git add
selector (ga
)
-
Interactive
git log
viewer (glo
)
The log graph can be disabled by option FORGIT_LOG_GRAPH_ENABLE
(see discuss in issue #71).
-
Interactive
.gitignore
generator (gi
)
-
Interactive
git diff
viewer (gd
) -
Interactive
git reset HEAD <file>
selector (grh
) -
Interactive
git checkout <file>
selector (gcf
) -
Interactive
git checkout <branch>
selector (gcb
) -
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 blame
selector (gbl
) -
Interactive
git commit --fixup && git rebase -i --autosquash
selector (gfu
)
⌨ Keybinds
Key
Action
Enter
Confirm
Tab
Toggle mark and move up
Shift – Tab
Toggle mark and move down
?
Toggle preview window
Alt – W
Toggle preview wrap
Ctrl – S
Toggle sort
Ctrl – R
Toggle selection
Ctrl – Y
Copy commit hash*
Ctrl – K / P
Selection move up
Ctrl – J / N
Selection move down
Alt – K / P
Preview move up
Alt – J / N
Preview move down
* Available when the selection contains a commit hash.
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
.
shell aliases
You can change the default aliases by defining these variables below.
(To disable all aliases, Set the FORGIT_NO_ALIASES
flag.)
forgit_log=glo forgit_diff=gd forgit_add=ga forgit_reset_head=grh forgit_ignore=gi forgit_checkout_file=gcf forgit_checkout_branch=gcb 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
git
You can use forgit as a subcommand of git by making git-forgit
available in $PATH
:
# after `forgit` was loaded export PATH="$PATH:$FORGIT_INSTALL_DIR/bin"
Some plugin managers can help do this.
Then any forgit command will be a subcommand 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
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 case
Option
Fallbacks to
common pager
FORGIT_PAGER
git config core.pager
or cat
pager on git show
FORGIT_SHOW_PAGER
git config pager.show
or $FORGIT_PAGER
pager on git diff
FORGIT_DIFF_PAGER
git config pager.diff
or $FORGIT_PAGER
pager on git blame
FORGIT_BLAME_PAGER
git config pager.blame
or $FORGIT_PAGER
pager on gitignore
FORGIT_IGNORE_PAGER
bat -l gitignore --color always
or cat
git log format
FORGIT_GLO_FORMAT
%C(auto)%h%d %s %C(black)%C(bold)%cr%reset
fzf options
You can add default fzf options for forgit
, including keybinds, 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:
Command
Option
ga
FORGIT_ADD_FZF_OPTS
glo
FORGIT_LOG_FZF_OPTS
gi
FORGIT_IGNORE_FZF_OPTS
gd
FORGIT_DIFF_FZF_OPTS
grh
FORGIT_RESET_HEAD_FZF_OPTS
gcf
FORGIT_CHECKOUT_FILE_FZF_OPTS
gcb
FORGIT_CHECKOUT_BRANCH_FZF_OPTS
gbd
FORGIT_BRANCH_DELETE_FZF_OPTS
gct
FORGIT_CHECKOUT_TAG_FZF_OPTS
gco
FORGIT_CHECKOUT_COMMIT_FZF_OPTS
grc
FORGIT_REVERT_COMMIT_OPTS
gss
FORGIT_STASH_FZF_OPTS
gsp
FORGIT_STASH_PUSH_OPTS
gclean
FORGIT_CLEAN_FZF_OPTS
grb
FORGIT_REBASE_FZF_OPTS
gbl
FORGIT_BLAME_FZF_OPTS
gfu
FORGIT_FIXUP_FZF_OPTS
gcp
FORGIT_CHERRY_PICK_FZF_OPTS
Complete loading order of fzf options is:
-
FZF_DEFAULT_OPTS
(fzf global) -
FORGIT_FZF_DEFAULT_OPTS
(forgit global) -
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
Option
Description
Default
FORGIT_LOG_FORMAT
git log format
%C(auto)%h%d %s %C(black)%C(bold)%cr%Creset
FORGIT_PREVIEW_CONTEXT
lines of diff context in preview mode
3
FORGIT_FULLSCREEN_CONTEXT
lines of diff context in fullscreen mode
10
📦 Optional dependencies
-
delta
/diff-so-fancy
: For better human readable diffs. -
bat
: Syntax highlighting forgitignore
. -
emoji-cli
: Emoji support forgit log
.
💡 Tips
-
Most of the commands accept optional arguments (eg,
glo develop
,glo f738479..188a849b -- main.go
,gco master
). -
gd
supports specifying revision(eg,gd HEAD~
,gd v1.0 README.md
). -
Call
gi
with arguments to get the wanted.gitignore
contents directly(eg,gi cmake c++
). -
You can use the commands as sub-commands of
git
, see #147 for details.
📃 License
MIT (c) Wenxuan Zhang