Skip to content
This repository
branch: master
Tim Pope
file 320 lines (252 sloc) 15.806 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319
*fugitive.txt* A Git wrapper so awesome, it should be illegal

Author: Tim Pope <>
License: Same terms as Vim itself (see |license|)

This plugin is only available if 'compatible' is not set.


Whenever you edit a file from a Git repository, a set of commands is defined
that serve as a gateway to Git.

COMMANDS *fugitive-commands*

These commands are local to the buffers in which they work (generally, buffers
that are part of Git repositories).

:Git [args] Run an arbitrary git command. Similar to :!git [args]
                        but chdir to the repository tree first.

:Git! [args] Like |:Git|, but capture the output into a temp file,
                        and edit that temp file.

:Gcd [directory] |:cd| relative to the repository.

:Glcd [directory] |:lcd| relative to the repository.

:Gstatus Bring up the output of git-status in the preview
                        window. The following maps, which work on the cursor
                        line file where sensible, are provided:

                        g? show this help
                        <C-N> next file
                        <C-P> previous file
                        <CR> |:Gedit|
                        - |:Git| add
                        - |:Git| reset (staged files)
                        cA |:Gcommit| --amend --reuse-message=HEAD
                        ca |:Gcommit| --amend
                        cc |:Gcommit|
                        cva |:Gcommit| --amend --verbose
                        cvc |:Gcommit| --verbose
                        D |:Gdiff|
                        ds |:Gsdiff|
                        dp |:Git!| diff (p for patch; use :Gw to apply)
                        dp |:Git| add --intent-to-add (untracked files)
                        dv |:Gvdiff|
                        O |:Gtabedit|
                        o |:Gsplit|
                        p |:Git| add --patch
                        p |:Git| reset --patch (staged files)
                        q close status
                        R reload status
                        S |:Gvsplit|

:Gcommit [args] A wrapper around git-commit. If there is nothing
                        to commit, |:Gstatus| is called instead. Unless the
                        arguments given would skip the invocation of an editor
                        (e.g., -m), a split window will be used to obtain a
                        commit message. Write and close that window (:wq or
                        |:Gwrite|) to finish the commit. Unlike when running
                        the actual git-commit command, it is possible (but
                        unadvisable) to muck with the index with commands like
                        git-add and git-reset while a commit message is

:Ggrep [args] |:grep| with git-grep as 'grepprg'.

:Glgrep [args] |:lgrep| with git-grep as 'grepprg'.

:Glog [args] Load all previous revisions of the current file into
                        the quickfix list. Additional git-log arguments can
                        be given (for example, --reverse). If "--" appears as
                        an argument, no file specific filtering is done, and
                        previous commits rather than previous file revisions
                        are loaded.

:Gllog [args] Like |:Glog|, but use the location list instead of the
                        quickfix list.

                                        *fugitive-:Gedit* *fugitive-:Ge*
:Gedit [revision] |:edit| a |fugitive-revision|.

:Gsplit [revision] |:split| a |fugitive-revision|.

:Gvsplit [revision] |:vsplit| a |fugitive-revision|.

:Gtabedit [revision] |:tabedit| a |fugitive-revision|.

:Gpedit [revision] |:pedit| a |fugitive-revision|.

:Gsplit! [args] *fugitive-:Gsplit!* *fugitive-:Gvsplit!*
:Gvsplit! [args] *fugitive-:Gtabedit!* *fugitive-:Gpedit!*
:Gtabedit! [args] Like |:Git!|, but open the resulting temp file in a
:Gpedit! [args] split, tab, or preview window.

:Gread [revision] Empty the buffer and |:read| a |fugitive-revision|.
                        When the argument is omitted, this is similar to
                        git-checkout on a work tree file or git-add on a stage
                        file, but without writing anything to disk.

:{range}Gread [revision]
                        |:read| in a |fugitive-revision| after {range}.

:Gread! [args] Empty the buffer and |:read| the output of a Git
                        command. For example, :Gread! show HEAD:%.

:{range}Gread! [args] |:read| the output of a Git command after {range}.

                                        *fugitive-:Gw* *fugitive-:Gwrite*
:Gwrite Write to the current file's path and stage the results.
                        When run in a work tree file, it is effectively git
                        add. Elsewhere, it is effectively git-checkout. A
                        great deal of effort is expended to behave sensibly
                        when the work tree or index version of the file is
                        open in another buffer.

:Gwrite {path} You can give |:Gwrite| an explicit path of where in
                        the work tree to write. You can also give a path like
                        :0:foo.txt or even :0 to write to just that stage in
                        the index.

:Gwq [path] Like |:Gwrite| followed by |:quit| if the write

:Gwq! [path] Like |:Gwrite|! followed by |:quit|! if the write

:Gdiff [revision] Perform a |vimdiff| against the current file in the
                        given revision. With no argument, the version in the
                        index is used (which means a three-way diff during a
                        merge conflict, making it a git-mergetool
                        alternative). The newer of the two files is placed
                        to the right. Use |do| and |dp| and write to the
                        index file to simulate "git add --patch".

:Gsdiff [revision] Like |:Gdiff|, but split horizontally.

:Gvdiff [revision] Identical to |:Gdiff|. For symmetry with |:Gsdiff|.

:Gmove {destination} Wrapper around git-mv that renames the buffer
                        afterward. The destination is relative to the current
                        directory except when started with a /, in which case
                        it is relative to the work tree. Add a ! to pass -f.

:Gremove Wrapper around git-rm that deletes the buffer
                        afterward. When invoked in an index file, --cached is
                        passed. Add a ! to pass -f and forcefully discard the

:Gblame [flags] Run git-blame on the file and open the results in a
                        scroll bound vertical split. Press enter on a line to
                        reblame the file as it was in that commit. You can
                        give any of ltfnsewMC as flags and they will be passed
                        along to git-blame. The following maps, which work on
                        the cursor line commit where sensible, are provided:

                        g? show this help
                        A resize to end of author column
                        C resize to end of commit column
                        D resize to end of date/time column
                        q close blame and return to blamed window
                        gq q, then |:Gedit| to return to work tree version
                        <CR> q, then open commit
                        o open commit in horizontal split
                        O open commit in new tab
                        - reblame at commit
                        ~ reblame at [count]th first grandparent
                        P reblame at [count]th parent (like HEAD^[count])

:[range]Gblame [flags] Run git-blame on the given range.

:[range]Gbrowse If the remote for the current branch is on GitHub,
                        open the current file, blob, tree, commit, or tag
                        (with git-web--browse) on GitHub. Otherwise, open the
                        current file, blob, tree, commit, or tag in
                        git-instaweb (if you have issues, verify you can run
                        "git instaweb" from a terminal). If a range is given,
                        it is appropriately appended to the URL as an anchor.

                        To use with GitHub FI, point g:fugitive_github_domains
                        at a list of domains:
                        let g:fugitive_github_domains = ['']
:[range]Gbrowse! Like :Gbrowse, but put the URL on the clipboard rather
                        than opening it.

:[range]Gbrowse {revision}
                        Like :Gbrowse, but for a given |fugitive-revision|. A
                        useful value here is -, which ties the URL to the
                        latest commit rather than a volatile branch.

:[range]Gbrowse [...]@{remote}
                        Force using the given remote rather than the remote
                        for the current branch. The remote is used to
                        determine which GitHub repository to link to.

MAPPINGS *fugitive-mappings*

These maps are available everywhere.

<C-R><C-G> On the command line, recall the path to the current
                        object (that is, a representation of the object
                        recognized by |:Gedit|).

["x]y<C-G> Yank the commit SHA and path to the current object.

These maps are available in Git objects.

<CR> Jump to the revision under the cursor.

o Jump to the revision under the cursor in a new split.

S Jump to the revision under the cursor in a new
                        vertical split.

O Jump to the revision under the cursor in a new tab.

- Go to the tree containing the current tree or blob.

~ Go to the current file in the [count]th first

P Go to the current file in the [count]th parent.

C Go to the commit containing the current file.

. Start a |:| command line with the current revision
                        prepopulated at the end of the line.

a Show the current tag, commit, or tree in an alternate

SPECIFYING REVISIONS *fugitive-revision*

Fugitive revisions are similar to Git revisions as defined in the "SPECIFYING
REVISIONS" section in the git-rev-parse man page. For commands that accept an
optional revision, the default is the file in the index for work tree files
and the work tree file for everything else. Example revisions follow.

Revision Meaning ~
master .git/refs/heads/master
HEAD^{} The commit referenced by HEAD
HEAD^ The parent of the commit referenced by HEAD
HEAD: The tree referenced by HEAD
/HEAD The file named HEAD in the work tree
Makefile The file named Makefile in the work tree
HEAD^:Makefile The file named Makefile in the parent of HEAD
:Makefile The file named Makefile in the index (writable)
- The current file in HEAD
^ The current file in the previous commit
~3 The current file 3 commits ago
: .git/index (Same as |:Gstatus|)
:0 The current file in the index
:1 The current file's common ancestor during a conflict
:2 The current file in the target branch during a conflict
:3 The current file in the merged branch during a conflict
:/foo The most recent commit with "foo" in the message

STATUSLINE *fugitive-statusline*

Add %{fugitive#statusline()} to your statusline to get an indicator including
the current branch and the currently edited file's commit. If you don't have
a statusline, this one matches the default when 'ruler' is set:
    set statusline=%<%f\ %h%m%r%{fugitive#statusline()}%=%-14.(%l,%c%V%)\ %P
Use fugitive#head() to return the name of the current branch. If the current
HEAD is detached, fugitive#head() will return the empty string, unless the
optional argument is given, in which case the hash of the current commit will
be truncated to the given number of characters.

ABOUT *fugitive-about*

Grab the latest version or report a bug on GitHub:

Something went wrong with that request. Please try again.