conflict-marker.vimを使ってgitのconflictをvimで高速に解消する

PUBLISHED ON 2019-02-26 — DIFF, GIT, VIM

Summary

下記手順だとボチボチ速い

  1. vim conflict対象ファイル
  2. qa
  3. ]x
  4. どの内容を残すかで実行コマンドを変える
    • HEAD側を残すなら co
    • 非・HEAD側を残すなら ct
    • 両方残すなら cb
  5. q
  6. :%norm! @a

前提条件

  • rhysd/conflict-marker.vim プラグイン をインストールしておく
  • HEAD側を残すか/非・HEAD側を残すか?(あるいは両方消すか?)を個々に判断する必要がなく、ファイル全体で一律どちらを残すかが定まっている

vimで高速conflict解消

conflictなんか起こらない事が理想とはいえそれなりの規模の開発が並行で走っているとなかなかそうもいかず、起こる度に「conflict解消めんどいよね〜」という会話をしてたりします。最近もそういう会話からお互いのやり方を共有し合うという機会があったので、自分がVimで行っている方法を小ネタとして備忘。

前提条件に書いた通り、conflict箇所のどちらを削除するか?がファイル全体で定まっていると判断できたら、

  • conflict箇所にジャンプする
  • => 残したく無い方を削除する
  • => これをファイル全体で繰り返す

という作業を行えば良く、私が普段使っているNeoVim(Vim)のやり方を晒してみますと下記のような流れの作業になります。

  1. qa : レジスタaへのマクロの記録を開始する
  2. ]x : conflict箇所(下方)へジャンプする
  3. どの内容を残すかで実行コマンドを変える
  4. q : マクロの記録を終了する
  5. :%norm! @a : ファイル全体を対象にレジスタaに記録したマクロ(=conflict箇所へジャンプして不要なコードとconflictマーカーを削除)を実行する
    • :%norm! COMMAND で、ファイル全体でCOMMANDで指定したノーマルモードコマンドを実行する(詳細は :h normal-range でヘルプを参照)

HEAD側を残す作業例↓

1

conflictが無い平和な世界に、私は住みたい。