conflict-marker.vimを使ってgitのconflictをvimで高速に解消する
Summary
下記手順だとボチボチ速い
vim conflict対象ファイル
qa
]x
- どの内容を残すかで実行コマンドを変える
- HEAD側を残すなら
co
- 非・HEAD側を残すなら
ct
- 両方残すなら
cb
- HEAD側を残すなら
q
:%norm! @a
前提条件
- rhysd/conflict-marker.vim プラグイン をインストールしておく
- HEAD側を残すか/非・HEAD側を残すか?(あるいは両方消すか?)を個々に判断する必要がなく、ファイル全体で一律どちらを残すかが定まっている
vimで高速conflict解消
conflictなんか起こらない事が理想とはいえそれなりの規模の開発が並行で走っているとなかなかそうもいかず、起こる度に「conflict解消めんどいよね〜」という会話をしてたりします。最近もそういう会話からお互いのやり方を共有し合うという機会があったので、自分がVimで行っている方法を小ネタとして備忘。
前提条件に書いた通り、conflict箇所のどちらを削除するか?がファイル全体で定まっていると判断できたら、
- conflict箇所にジャンプする
- => 残したく無い方を削除する
- => これをファイル全体で繰り返す
という作業を行えば良く、私が普段使っているNeoVim(Vim)のやり方を晒してみますと下記のような流れの作業になります。
qa
: レジスタa
へのマクロの記録を開始する]x
: conflict箇所(下方)へジャンプする- conflict-marker.vim プラグイン の機能です。
[x
と入力すると逆に上方のconflict箇所へジャンプします
- conflict-marker.vim プラグイン の機能です。
- どの内容を残すかで実行コマンドを変える
- HEAD側を残すなら
co
- 非・HEAD側を残すなら
ct
- 両方残すなら
cb
- これらも conflict-marker.vim プラグイン の機能です
- HEAD側を残すなら
q
: マクロの記録を終了する:%norm! @a
: ファイル全体を対象にレジスタa
に記録したマクロ(=conflict箇所へジャンプして不要なコードとconflictマーカーを削除)を実行する:%norm! COMMAND
で、ファイル全体でCOMMAND
で指定したノーマルモードコマンドを実行する(詳細は:h normal-range
でヘルプを参照)
HEAD側を残す作業例↓
〆
conflictが無い平和な世界に、私は住みたい。