fugutive.vim
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.
— tpope/vim-fugitive: A Git wrapper
Get file local history/undotree:<leader>u
Open git commit UI, git status:<Leader>gg
Open git commit UI vertically::vert G
Fugitive menu:<leader>g
:diffoff[!]
::q[!]
to
close
:diffupdate
:
Index file represent last committed version of file.
Checkout branch:<leader>go
Grep in branch:<leader>gp
, <leader>gP
(quickfix list)
Move current file to another location :Git move
:<leader>gm
Stage current file if it’s working copy, or checkout if it’s index file
:Gwrite
or <leader>gW
:Gwrite
on index file will checkout file.
:Gwrite
on working copy will stage file.
:diffput
its like ==:Gwrite
== but for diff window and works with hunks.
:diffput
on working copy will stage hunk.
:diffput
on index file will checkout hunk.
dp
is hotkey for ==:diffput
==. p
is stays for “put”.
Checkout current file if it’s working copy, or stage if it’s index file
:Gread
or <leader>gR
:Gread
on index file will stage file.
:Gread
on working copy will checkout file.
:diffget
its like ==:Gread
== but for diff window and works with hunks.
:diffget
on working copy will checkout hunk.
:diffget
on index file will stage hunk.
do
is hotkey for ==:diffget
==. o
is stays for “obtain”.
:Gremove
:
:Gmove <relative_path>
:<ctrl-r>%
:G blame:<wbr class="f">
Open split window with blame buffer
:G commit
:
:Gedit :<path>
or Gedit :0
or <leader>ge
:
:Gdiffsplit
or <leader>gd
::q
:Git diff
or <leader>gD
:
:Git commit --ammend
or <leader>ga
:
:Git add -p
or <leader>gA
:
To use :diffget
on deleted lines, place cursor position after that lines.
List branches <leader>gb
and then press =<tab>
=.
Log git history of current file:<leader>gl
Search in git history (git log -S...
):<leader>gL
Open fugitive object in new split/tab:o
or O
Perform a :Gdiffsplit
on the file under the cursor.:dd
Perform a :Gvdiffsplit
on the file under the cursor:dv
Perform a :Ghdiffsplit
on the file under the cursor:ds
Open diff/git for current file:=
Stage/Unstage (add/reset) file, works in visual mode too (multiple files):-
Next/previous hunk:(
, )
Stage hunk:s
Unstage hunk:u
Stash the changes:czz
Apply topmost stash:cza
Commit staged changes:cc
Run git add –patch
for current file (interactive stage):P
Push changes:<leader>pp
(in fugitive mode for nvim)
Push and create merge request:<leader>pT
(in fugitive mode for nvim)
Pull:<leader>pP
(in fugitive mode for nvim)
During a merge conflict, this is a three-way diff against the “ours” and
“theirs” ancestors (open with dd
). Additional ==d2o
, d3o
, dp
== maps are
provided by vim-fugitive to obtain the hunk from the “ours” or “theirs”
ancestor, respectively.
What if I want to pick changes from head
(target branch) or from branch-name
(merge-branch) during merge conflict (ignore remote or local changes), how to do
it with vim-fugitive?
Need to use Gwrite!
, !
is required because this is dangerous command, and
you can lose your changes. Be very careful with this strategy anyway.
Git signs menu:<leader>h[key]
:Grename newname
:
TODO: cherry-pick file/changes