1. 程式人生 > 其它 >手動編輯檔案解決衝突_vimdiff,哪裡不同找哪裡,合併衝突也可以![視訊]

手動編輯檔案解決衝突_vimdiff,哪裡不同找哪裡,合併衝突也可以![視訊]

技術標籤:手動編輯檔案解決衝突

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/

3e973e57ab9898265fe2aec7b86cfbe9.png vimdiff 哪裡不同找哪裡https://www.zhihu.com/video/1117915480979013632