sponsor Vim development Vim logo Vim Book Ad

fugitive.vim : A Git wrapper so awesome, it should be illegal

 script karma  Rating 4736/1388, Downloaded by 20469  Comments, bugs, improvements  Vim wiki

created by
Tim Pope
script type
Fugitive is the premier Vim plugin for Git.  Or maybe it's the premier Git plugin for Vim?  Either way, it's "so awesome, it should be illegal".  That's why it's called Fugitive.

The crown jewel of Fugitive is :Git (or just :G), which calls any arbitrary Git command.  If you know how to use Git at the command line, you know how to use :Git.  It's vaguely akin to :!git but with numerous improvements:

* The default behavior is to directly echo the command's output.  Quiet commands like :Git add avoid the dreaded "Press ENTER or type command to continue" prompt.
* :Git commit, :Git rebase -i, and other commands that invoke an editor do their editing in the current Vim instance.
* :Git diff, :Git log, and other verbose, paginated commands have their output loaded into a temporary buffer.  Force this behavior for any command with :Git --paginate or :Git -p.
* :Git blame uses a temporary buffer with maps for additional triage.  Press enter on a line to view the commit where the line changed, or g? to see other available maps.  Omit the filename argument and the currently edited file will be blamed in a vertical, scroll-bound split.
* :Git mergetool and :Git difftool load their changesets into the quickfix list.
* Called with no arguments, :Git opens a summary window with dirty files and unpushed and unpulled commits.  Press g? to bring up a list of maps for numerous operations including diffing, staging, committing, rebasing, and stashing.  (This is the successor to the old :Gstatus.)
* This command (along with all other commands) always uses the current buffer's repository, so you don't need to worry about the current working directory.

Additional commands are provided for higher level operations:

* View any blob, tree, commit, or tag in the repository with :Gedit (and :Gsplit, etc.).  For example, :Gedit HEAD~3:% loads the current file as it existed 3 commits ago.
* :Gdiffsplit brings up the staged version of the file side by side with the working tree version.  Use Vim's diff handling capabilities to apply changes to the staged version, and write that buffer to stage the changes.  You can also give an arbitrary :Gedit argument to diff against older versions of the file.
* :Gread is a variant of git checkout -- filename that operates on the buffer rather than the file itself.  This means you can use u to undo it and you never get any warnings about the file changing outside Vim.
* :Gwrite writes to both the work tree and index versions of a file, making it like git add when called from a work tree file and like git checkout when called from the index or a blob in history.
* :Ggrep is :grep for git grep.  :Glgrep is :lgrep for the same.
* :GMove does a git mv on the current file and changes the buffer name to match.  :GRename does the same with a destination filename relative to the current file's directory.
* :GDelete does a git rm on the current file and simultaneously deletes the buffer.  :GRemove does the same but leaves the (now empty) buffer open.
* :GBrowse to open the current file on the web front-end of your favorite hosting provider, with optional line range (try it in visual mode).  Plugins are available for popular providers.

Add %{FugitiveStatusline()} to 'statusline' to get an indicator with the current branch in your statusline.

For more information, see :help fugitive.
install details
Extract in ~/.vim (~\vimfiles on Windows).

rate this script Life Changing Helpful Unfulfilling 
script versions (upload new version)

Click on the package to download.

package script version date Vim version user release notes
fugitive.zip 3.7 2022-06-07 7.3 Tim Pope Move "Unpushed" sections above "Unpulled".
Show commits that are unpushed anywhere when no upstream is set.
Provide czs map as :Git stash push --staged.
Support the MSYS Vim bundled with Git for Windows.
Turn remaining deprecated commands (:Gbrowse, etc.) into error stubs.
fugitive.zip 3.6 2021-11-26 7.3 Tim Pope Fix support for older Vim 7 patch levels.
Support copies on :Gclog --follow.
fugitive.zip 3.5 2021-11-15 7.3 Tim Pope Lazy initialization.
Make status buffer diff retrieval asynchronous.
Support jump to diff from :Git log --name-status.
Use smudge filters when viewing blobs.
Provide User FugitiveEditor event.
Provide FugitiveRemote() API function.
fugitive.zip 3.4 2021-09-03 7.3 Tim Pope Use jobs for all Git execution.  Faster and less prone to user error.
Stream :Git! to the preview window.
Make :Git grep behave like other :Git commands, not :Ggrep.
Silence output and open quickfix list on :Ggrep -q.
Support :Ggrep outside repository with --no-index.
Expand ##, $ENVVAR, and ~/path in arguments to :Git.
Expand "%" and other special sequences during tab completion.
Improve tab completion for :Git push.
Disable -- More -- prompt on :Git push, fetch, and --no-pager.
Provide FugitiveObject/FugitiveStageBlob/FugitivePager events.
Simplify :Gdiffsplit "smart" split direction.
Support jump to commit in :Git log --graph.
Use local not upstream branch name for :GBrowse default.
Better support for ssh config in :GBrowse.
Replace older deprecation warnings with error messages.
Assorted public API enhancements.
Require Git 1.8.5 or newer.
Require Vim 7.3 or newer.  Full functionality requires Vim 8.1.
Directly echo :Git output for trivial commands like "add" on Vim 7.
Fix E1208 when loading plugin on Vim 8.2.3141.
fugitive.zip 3.3 2021-04-16 7.0 Tim Pope Replace :! :Git backend with smart job runner.
Replace special cased commit/revert/rebase/merge/etc. with regular :Git.
Support :Git -c config.name=value and other common flags.
Improve completion of :Git subcommands, including hiding plumbing commands.
Improve completion of arguments to :Git subcommands.
Show unpulled and unpushed sections for both upstream and push remote.
Introduce capitalized naming scheme for :GMove/:GRename/:GRemove/:GDelete/:GBrowse.
Expand SSH host aliases in remote URLs for :GBrowse.
Enable opening arbitrary URLs with :GBrowse.
Add warnings to deprecated commands.
Remove all other temp buffer commands in favor of :Git --paginate.
Don't automatically invoke :setlocal foldmethod=syntax in Fugitive buffers.
Support colored :Git blame commits in 256 color terminals.
Bug fixes.
fugitive.zip 3.2 2020-01-21 7.0 Tim Pope Provide :Git mergetool to load conflicts into quickfix list.
Provide :Git difftool to load arbitrary changesets into quickfix list.
Call FugitiveBlob/FugitiveCommit/etc autocommands on Fugitive buffer load.
:Git --paginate display results in temp buffer.
:Git --no-pager no longer displays results in temp buffer.
Accomodate loading Fugitive buffers in popup window.
Better PowerShell support.
Bug fixes.
fugitive.zip 3.1 2019-10-11 7.0 Tim Pope Commands are now global, not buffer local.
Calling a command in an unnamed buffer uses the working directory.
Preserve line number on :Gedit to return to work tree buffer.
Better submodule support in :Gstatus.
Support git-blame revision ignoring features.
Show first parent diff in merge commit buffer.
Remove deprecated support for .git/tags.
Bug fixes.
fugitive.zip 3.0 2019-08-20 7.0 Tim Pope Use custom format for :Gstatus, not literal git status output.
Inline diffing in :Gstatus, with support for staging individual hunks.
List unpushed and unpulled commits in :Gstatus.
Show rebase status in :Gstatus.
Greatly expanded set of mappings in :Gstatus. Try g?, c?, and r?.
:Gstatus p (add --patch) is changed to P.
:Gstatus U (checkout/clean) is changed to X. New U behavior is global reset.
:Gstatus 2X/3X performs checkout --ours/--theirs.
:Gstatus gI ignores file.
Smarter :Gstatus automatic reload.
:Git subcommand calls :Gsubcommand when appropriate.
:Git add --patch and similar commands use :terminal.
:Git diff, :Git log, and :Git --no-pager display results in temp buffer.
:Git and subcommand wrappers use custom quoting rather than shell escaping.
:Git ... ./path is relative to working directory.
Add --option completion to :Git and git wrappers.
Provide :G as wrapper for both :Gstatus and :Git.
Support for :Grebase --interactive.
:Gblame accepts all arguments, including filenames and commits.
Support :Gblame --reverse to navigate forwards through history.
Support :Gblame with range to blame subset of current file.
Allow disabling dynamic blame colors with let g:fugitive_dynamic_colors = 0.
:Glog opens quickfix list instead of displaying raw log output.
Cleaner :Glog quickfix list leveraging Vim's new "module" format.
:Glog no longer defaults to current file.  Use :0Glog for that.
:0Glog follows file across renames.
:Glog name softly deprecated in favor of :Gclog (named after :cfile).
Provide :Grevert.
:Gdiff renamed to :Gdiffsplit.
:Gdiffsplit always opens one window.  Use :Gdiffsplit! for conflicts.
Support git grep --column.
Chdir with git -C rather than :cd for most commands. (Git 1.8.5 required).
Show all stderr hook output on :Gcommit.
Provide core.askPass default for Gpush and friends.
Require bang to :Gwrite from index.
Bug fixes.
fugitive.zip 2.5 2018-11-23 7.0 Tim Pope Support :source and :write on Fugitive URLs.
Support :Gedit +cmd ++opt.
Support :Gedit /absolute/path and ./relative/path.
Support expansion flags, like :Gedit %:h.
Support completion of commits for --fixup=/--squash=.
Support :Gread commit to read commit message.
Adjust :Gbrowse line range for upstream head.
Map <CR> in blobs to jump to blamed commit.
Map p to jump to file in preview window.
Make :Gmove always relative to repository root.
Load Projectionist config from .git/info/projections.json.
Drop instaweb support.
New public function API.
Major robustness and error handling improvements.
Bug fixes.
fugitive.zip 2.4 2018-07-10 7.0 Tim Pope Split into plugin, autoload, and ftdetect files.
Support mods like :vertical on :Gstatus and :Gedit family.
Provide :Grebase (no --interactive).
Bug fixes.
fugitive.zip 2.3 2018-05-29 7.0 Tim Pope Support worktrees.
Provide API for extensible :Gbrowse support.
Remove GitHub URL support in favor of rhubarb.vim.
Provide :Gdelete to delete both file and buffer.
Provide :Grename to move relative to file's parent directory.
Split to open file when :Gstatus is only window.
Provide U in :Gstatus to discard changes.
Provide additional :Gstatus commit maps.
Provide d2o and d3o to obtain diff during conflict.
Support :tab Gcommit.
Open :Gcommit tab before current.
Support :Gdiff +cmd.
Support gf in Git file types.
Add flagship.vim statusline indicator.
Use the Neovim terminal emulator for :Git.
Bug fixes.
fugitive.zip 2.2 2015-01-20 7.0 Tim Pope Provide :Gpush, :Gfetch, :Gmerge, and Gpull.
Use -L to handle :Glog range.
:Gcommit -v opens message in new tab.
API for custom :Gbrowse handlers.
Invoke :Browse if available to open URL.
Colorize hashes in :Gblame buffer.
Set cursorbind and nobuflisted in :Gblame buffers.
:Gblame in blame buffer toggles buffer.
fugitive.zip 2.1 2014-06-24 7.0 Tim Pope Fix :Gdiff horizontal/vertical disposition.
fugitive.zip 2.0 2014-06-23 7.0 Tim Pope <C-R><C-G> in :Gstatus recalls cursor line filename.
Map dp to show diff in :Gstatus.
Add ca and cA commit maps to :Gstatus.
Add cc alias for C in :Gstatus.
Disable swapfile in :Gstatus.
Replace :Gstatus cv with cva and cvc.
Add an `S` mapping for vertical splits from :Gstatus.
Close diffs when navigating from :Gstatus.
Enable folding in :Gstatus.
Accept a count with :Gstatus <C-N>/<C-P>.
Allow <C-p> pass through to ctrlp.vim in :Gstatus.
Add . in :Gstatus to prepopulate command line with revision.
Fix :Gstatus dp with external diff enabled.
Force displayCommentPrefix to fix :Gstatus on 1.8.5+.
Support localized `git status`.
Map g? and <F1> to show help in :Gstatus and :Gblame.
Kill relativenumber in blame buffer.
Fix jump to line on reblame.
Return to blamed buffer on q in blame.
Restore blamed window on gq in blame.
Fix :Gblame scrollbind with folds.
Jump from blame to commit focuses relevant diff.
:Gblame: Retain original alternate buffer.
Use - not <CR> for reblame.
Switch :Gblame <CR> to open commit.
Open fold when jumping to commit from blame.
Add maps for resizing blame window.
Conceal file names and line numbers in :Gblame.
Set winfixwidth in :Gblame buffers.
Press <CR> in :Gblame to open commit (reblame is now -).
Better csh support.
Work around "always" color option.
Fix trailing blank line when editing index files.
Use HTTPS for GitHub URLs in README.
:Gdiff split direction based on 'diffopt' and window size.
Focus diff window on :Gdiff.
Restore options when turning off diff mode.
Set bufhidden=delete in historical buffers.
Fix modeline errors in historical buffers.
Change cp to cP.
Add :Git! et al. for loading output into a buffer.
Tab complete Git aliases.
Enter on a +/- diff line jumps to that line.
Better Windows support.
Support core.autocrlf=false on Windows.
Work around slow \\ Windows network path.
Work around .git in 'wildignore'.
Fix garbage during :Gcommit with alternate screen.
Fix garbling on :Gcommit when nothing is staged.
Hack around broken :Gcommit with symlinked .git.
Use y<C-G> to yank the current object's path.
Preserve alternate file in :Gmove.
Support bare repositories that don't end in .git.
Support .git-file repositories (including submodules).
Support symlinked .git if core.worktree is set.
Fix redraw issue after :Gbrowse.
Support GitHub FI in :Gbrowse.
Support implicit GitHub username in remote for :Gbrowse.
Make fugitive commands available in nerdtree buffers.
Make fugitive commands available in command line window.
:Glgrep and :Gllog.
:.Glog jumps to same line in each file.
Map - to go up a directory.
Provide custom 'foldtext'.
Look for $GIT_DIR and $GIT_WORK_TREE.
Improve Windows support.
Assorted bug fixes.
fugitive.zip 1.2 2011-04-29 7.0 Tim Pope Support :Gmove in a directory.
Provide :Gbrowse to open code on GitHub or in git-instaweb.
Provide :Gwq to :quit after :Gwrite.
Provide :Gsdiff to do a horizontal diff.
Map ds in :Gstatus to do a horizontal diff.
Map <C-N> and <C-P> in :Gstatus to cycle between files.
Map `-` on headings in :Gstatus.
Map dp in stage conflict to do the right thing.
Point 'tags' at .git/tags.
Windows fixes. [Michael Geddes]
fugitive.zip 1.1 2010-03-21 7.0 Tim Pope Much better windows support ('shellslash' no longer required).
Delete blame buffers when closed.
Pass :Gblame flags along to git-blame.
Fix duplicate "Signed-off-by" lines.
Finish pending commit even if exiting Vim.
Allow double quotes in :Git and :Ggrep arguments.
`D` in :Gstatus shows a diff.
fugitive.zip 1.0 2010-02-15 7.0 Tim Pope Initial upload
ip used for rating:

If you have questions or remarks about this site, visit the vimonline development pages. Please use this site responsibly.
Questions about Vim should go to the maillist. Help Bram help Uganda.