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/