How can I view git diff for any commit using vim-fugitive?
Solution 1
Diff between current file and the index
:Gdiff :0
Diff between current file and some other [revision]
:Gdiff [revision]
Diff between current file and current file 3 commits ago:
:Gdiff ~3
Solution 2
You can use :Glog
to get the history changes for current file. You can use :cnext
or :cprevious
to move between changes. When you hit the version that you want to compare then you can use :Gdiff
. You can exit from vimdiff closing the buffer :q
and exit from history log with :Gedit
.
This is my .vimrc keyboard config:
nnoremap <leader>gs :Gstatus<CR>
nnoremap <leader>gc :Gcommit -v -q<CR>
nnoremap <leader>ga :Gcommit --amend<CR>
nnoremap <leader>gt :Gcommit -v -q %<CR>
nnoremap <leader>gd :Gdiff<CR>
nnoremap <leader>ge :Gedit<CR>
nnoremap <leader>gr :Gread<CR>
nnoremap <leader>gw :Gwrite<CR><CR>
nnoremap <leader>gl :silent! Glog<CR>
nnoremap <leader>gp :Ggrep<Space>
nnoremap <leader>gm :Gmove<Space>
nnoremap <leader>gb :Git branch<Space>
nnoremap <leader>go :Git checkout<Space>
nnoremap <leader>gps :Dispatch! git push<CR>
nnoremap <leader>gpl :Dispatch! git pull<CR>
I recommend unimpaired.vim
plugin by Tim Pope.
With that configuration, my workflow is:
<Leader>gl
to view history
]q
and [q
to move between versions (unimpaired.vim)
<Leader>gd
to open diff
:q
to end diff
<Leader>ge
to return to my working copy.
Solution 3
Adding to above answer:
If you want to get a diff, of a particular file from another branch
Gdiff branch_name:path/to/dir/filename.txt
Solution 4
I just drop here the way I view a diff if the :Glog --
or :Glog -- %
(for current file) is used:
:Glog --
:cw
to open a list of commits- Navigate to a commit and its info as well affected files are shown
- Focus on a file path
<c-w>gf
and the diff is opened in new tab:tabclose
to just close the tab and get the previous state before the diff
Sathish
Updated on August 19, 2021Comments
-
Sathish over 2 years
vim-fugitive side-by-side git diff is great for viewing diff of unstaged files.
How can I use vim-fugitive to git diff
- staged files?
- any git revision?
-
Sathish about 11 yearsFor :Gdiff i need to know the files which were changed in a revision. :Gstatus lists uncommitted files on which i can press D to view the diff. How can i get similar file list and diff on any revision. :Gstatus revision doesn't work!
-
Peter Rincker about 11 yearsI feel like this is the wrong way to approach the problem. You can use
:Glog --
to populate thequickfix
window with previous commits and explore the commits. I would highly suggest you take a look at the vimcast series on fugitive: vimcasts.org/blog/2011/05/the-fugitive-series -
Ain Tohvri about 9 yearsYou can also go
Gdiff <branch>
on a buffer if the same file is also present in the <branch>. -
gauteh about 7 yearsalso requires vim-dispatch
-
Bluu over 6 yearsThese all operate on a single file. If you can stomach the native output of Git, take a look at
:Git!
. For example,:Git! show [revision]
will load a syntax-highlight patch of all files in[revision]
. It's not as nice as the custom interaction model of:Gstatus
, but can be a handy reference in a split. -
icc97 almost 6 yearsOnce you've staged your changes and are typing the commit message inside
Gcommit
I believe the correct command you want is:Gvdiff ~1
this creates a vertical split which I find easier to see the differences and also more space efficient as the top pane is then still your commit message and your diff is a vertical split below that -
Peter Rincker almost 6 years@icc97 you can also do
:Gcommit --verbose
orcvc
from the:Gstatus
window. -
Eric Sun over 4 yearsHi there. This worked perfect. But what is the meaning of
gf
here? I don't find it infugitive
documentation. -
starikovs over 4 yearsHey!
gf
means editing the existing file under the cursor in the same window.