Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
vimdiff cheat sheet

vimdiff cheat sheet

##git mergetool

In the middle file (future merged file), you can navigate between conflicts with ]c and [c.

Choose which version you want to keep with :diffget //2 or :diffget //3 (the //2 and //3 are unique identifiers for the target/master copy and the merge/branch copy file names).

:diffupdate (to remove leftover spacing issues)
:only (once you’re done reviewing all conflicts, this shows only the middle/merged file)
:wq (save and quit)
git add .
git commit -m “Merge resolved”

If you were trying to do a git pull when you ran into merge conflicts, type git rebase –continue.

##vimdiff commands

]c :        - next difference
[c :        - previous difference
do          - diff obtain
dp          - diff put
zo          - open folded text
zc          - close folded text
:diffupdate - re-scan the files for differences
@573

This comment has been minimized.

Copy link

commented Jun 26, 2015

C-W C-W lets you toggle between the diff columns

@uwo

This comment has been minimized.

Copy link

commented Oct 11, 2015

thanks!

@pankajmodi

This comment has been minimized.

Copy link

commented Nov 4, 2015

To avoid whitespace comparison:

:set diffopt+=iwhite

@ejlp12

This comment has been minimized.

Copy link

commented Nov 22, 2015

press CTRL+W twice lets you toggle between the diff columns

@plank-sr

This comment has been minimized.

Copy link

commented Nov 22, 2015

C-W "direction" for moving between windows. If you're in the left column and want to be in the right: ctrl-w l.
If you're in the right column and want to be in the left: ctrl-w h

@bhch

This comment has been minimized.

Copy link

commented Mar 4, 2016

@573 @ejlp12 Actually, the command is C-W W i.e. Ctrl-W W. No need to hit Ctrl twice.

@johncip

This comment has been minimized.

Copy link

commented Jun 3, 2016

smart quotes in git commit -m “Merge resolved” :)

@knayan1

This comment has been minimized.

Copy link

commented Sep 19, 2016

To wrap lines :set wrap
To remove colors: :syn off

@vivamus

This comment has been minimized.

Copy link

commented Sep 22, 2016

zR command unfold ALL lines -- I feel safer to merge when I see complete files

Also, if you merge frequently, you may prefer to use ] and [ instead of ]c and [c
Put following to your .vimrc

   map ] ]c
   map [ [c

To limit this action to diff mode, use following
(highlight colors are modified to fit my particular background, you may ignore hi commands and set cursorline)

if &diff
    set cursorline
    map ] ]c
    map [ [c
    hi DiffAdd    ctermfg=233 ctermbg=LightGreen guifg=#003300 guibg=#DDFFDD gui=none cterm=none
    hi DiffChange ctermbg=white  guibg=#ececec gui=none   cterm=none
    hi DiffText   ctermfg=233  ctermbg=yellow  guifg=#000033 guibg=#DDDDFF gui=none cterm=none
endif
@choikwa

This comment has been minimized.

Copy link

commented Dec 27, 2016

A really desirable command would be having each window focused and allowing ]c [c commands to only jump on diff to original caused by its changes. In short, left column being mine should only traverse changes due to my changes only. Right column should traverse incoming changes (theirs), and bottom row should include both.

That way, I can traverse only my changes and detect if there is conflict.

EDIT: nvm, just searching for <<<<<<<, =======, >>>>>>> for conflict markers also works.

@alekibango

This comment has been minimized.

Copy link

commented Jan 6, 2018

C-o previously opened text. especially good on jumping back to list of files when you start by vim directory, pick file and you need to get back to list of files.

@Ablesius

This comment has been minimized.

Copy link

commented Apr 11, 2018

If you were trying to do a git pull when you ran into merge conflicts, type git rebase –continue.

Note that this is only the case when you have set pull.rebase = true. If not, you're doing a normal merge, and there's no rebase running you can continue :)

@newgoliath

This comment has been minimized.

Copy link

commented May 2, 2018

zr open all folds
zm close all folds

@dsaw

This comment has been minimized.

Copy link

commented May 3, 2018

The default identifiers that can be selected using diffget
LO local master copy
RE remote master to be merged
BA common ancestor of remote and local changes.

@markhu

This comment has been minimized.

Copy link

commented May 4, 2018

When I do vimdiff on two files, then later open the same two files with vim -o it restores vimdiff mode to my consternation. Still looking for a way out, otherwise I'd post a tip here.

@pieman72

This comment has been minimized.

Copy link

commented May 15, 2018

@markhu: This was happening to me, too. In my case, it was because my vimrc contained: autocmd BufWrite *[a-zA-Z0-9_.]* mkview, which forces a view to be created on every save (buffer write) and autocmd BufRead *[a-zA-Z0-9_.]* silent! loadview, which tries to load a view on every file open (buffer read). Since vimdiff uses folds and other formatting that gets included in the view, these artifacts appear when opening the file again in vim normally (e.g. vim -o). I resolved this by putting those commands behind a check for vimdiff mode:

if !&diff                                                                          
  autocmd BufWrite *[a-zA-Z0-9_.]* mkview                                          
  autocmd BufRead *[a-zA-Z0-9_.]* silent! loadview                                 
endif
@deniztoprak

This comment has been minimized.

Copy link

commented Mar 22, 2019

do (diff obtain): bring changes from the other file to the current file
dp (diff put): send changes from the current file to the other file

@MikaelElkiaer

This comment has been minimized.

Copy link

commented May 20, 2019

Could anyone tell me how to bring changes from multiple files?
:diffget will only bring from one file, and when doing :diffget multiple times it will overwrite the previous pick.
I often need this when consolidating changes where I need from both local and remote, e.g. for import statements or package references.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.