vimdiff,哪里不同找哪里,合并冲突也可以![视频]

285 阅读3分钟
原文链接: zhuanlan.zhihu.com

hello,这一期视频介绍下 vimdiff 的使用,包括使用 vim 来比对文件,合并代码冲突等(我会手动构造冲突来做个演示),希望对大家有帮助。

日常编辑文件,代码或者合并代码冲突的时候,我们经常需要使用文本比较或者合并工具, 目前市面上有一些收费软件比如 Beyond Compare等,也有一些好用的免费的软件比如 meld/kdiff3 等,使用 IDEA 之类的 IDE 开发工具也可以实现代码合并,当然如果你懒得下载其他软件,使用 vim 也可以进行文本的比较或者代码冲突合并,本次视频将介绍 vimdiff 工具的使用,虽然比起商业软件来说没有那么强大,但是很多场景下使用绰绰有余了。

从一件事引入

记得有次同事给了我两个比较长的命令,说明明看起来一样就是执行起来一个能用,一个不能用,自己瞅了好久愣是没看出来区别,拿给我看看。 我当时复制了下两条命令直接贴到了 vim 里比较了下,直接就看出了不同(实际上就是一个字符的区别,比如1和l这种有些字体下难以区分),文本比对工具在某些场景下很有用。

另外一个场景就是合并代码冲突,平常我们使用的比较多的是三路合并工具,如果你用过 IDEA 或者其他 Jetbrains 全家桶工具应该有体会。

什么是 vimdiff

vim自带的文件比较工具。在一些场景下比如没有软件或者服务器上可以方便地使用 vim 来比对文本或者解决代码冲突。

使用方式

vimdiff or vim -d file1 file2

vim会使用不同的颜色来标志,当然你可以自定义这些配置。

使用vim 合并代码冲突

可以先配置 git 使用 vimdiff 作为合并工具。视频里会构造代码冲突做一个演示。

git config merge.tool vimdiff

+--------------------------------+
| LOCAL  |     BASE     | REMOTE |
+--------------------------------+
|             MERGED             |
+--------------------------------+
  • LOCAL - the head for the file(s) from the current branch on the machine that you are using.
  • REMOTE - the head for files(s) from a remote location that you are trying to merge into your LOCAL branch.
  • BASE - the common ancestor(s) of LOCAL and BASE.
  • MERGED - the tag / HEAD object after the merge - this is saved as a new commit.
:diffg RE  # get from REMOTE
:diffg BA  # get from BASE
:diffg LO  # get from LOCAL

]c - Jump to the next change.
[c - Jump to the previous change.

当然如果觉得麻烦,可以映射快捷键

let mapleader=','
let g:mapleader=','

if &diff
    map <leader>1 :diffget LOCAL<CR>
    map <leader>2 :diffget BASE<CR>
    map <leader>3 :diffget REMOTE<CR>
endif

使用 Gdiff

其实如果使用了 fuguitive 插件,我们在修改了代码之后,还可以使用 :Gdiff 来比对代码的修改。

替代品

Beyond Compare/kdiff3/meld/IDEA 合并工具等可以使用。

读者可以自行尝试并选择一个自己喜欢的,但有些并不是免费软件。

参考

https://stackoverflow.com/questions/14904644/how-do-i-use-vimdiff-to-resolve-a-conflict

https://www.grzegorowski.com/using-vim-or-neovim-nvim-as-a-git-mergetool/

https://gist.github.com/karenyyng/f19ff75c60f18b4b8149

https://kinboyw.github.io/2018/10/09/Use-Vimdiff-As-Git-Mergetool/

vimdiff 哪里不同找哪里