ITエンジニアによるITエンジニアのためのブログ

Railsアップグレードのマージツールにvimdiffを指定する方法

Ruby on Railsのバージョンをアップデートする際、rails app:updateというタスクで設定ファイルなどを更新します。このとき、既存のファイルと新しいバージョンのファイルをマージ(統合)する必要があります。

本記事では、このマージ作業のツールとしてvimdiffを使うための設定方法と基本的な使い方を解説します。

目次

  • マージツール設定方法
  • THOR_MERGE環境変数を使う方法
  • Gitでマージツールを設定する方法
  • vimdiffの起動
  • vimdiffの画面の見方とマージ作業
  • まとめ

マージツール設定方法

rails app:update は内部で ThorというGemを使用しています。

Thorは、コンフリクトが発生した際にどのマージツールを起動するかを、以下の順で決定します。

  1. THOR_MERGE 環境変数
  2. Gitのマージツール設定(git config merge.tool

両方が設定されている場合は、THOR_MERGE環境変数の値が優先されます。

THOR_MERGE環境変数を使う方法

この方法は、Gitのグローバル設定を変更したくない場合や、特定のプロジェクトやその場限りでマージツールを指定したい場合に便利です。

一時的に指定して実行する

最も簡単な方法は、コマンドの実行時にだけ環境変数を指定することです。

# Bash
THOR_MERGE=vimdiff rails app:update

このように実行すると、このコマンドの実行中だけ THOR_MERGEvimdiff に設定されます。

常にvimdiffを使うように設定する

もし常に vimdiff を使いたい場合は、お使いのシェルの設定ファイル(.bashrc, .zshrc など)に以下の行を追加します。

export THOR_MERGE=vimdiff

設定を反映させるには、ファイルを保存した後に source ~/.your_shell_rc_file を実行するか、新しいターミナルセッションを開始します。

正しく設定されたかを確認するには、以下のコマンドを実行します。

# Bash
echo $THOR_MERGE
# vimdiffと出力されれば設定されています。

Gitでマージツールを設定する方法

以下のコマンドで、Gitのグローバル設定としてvimdiffを指定することもできます。

git config --global merge.tool vimdiff

ホームディレクトリの.gitconfigファイルに以下が追記されていれば設定完了です。

# ~/.gitconfig
[merge]
	tool = vimdiff

vimdiffの起動

いずれかの方法でマージツールをvimdiffに設定した状態で、rails app:update コマンドを実行します。

設定ファイルに差分があり、マージが必要になると、以下のようなプロンプトが表示されます。

Overwrite config/initializers/new_framework_defaults_7_0.rb? (enter "h" for help) [Ynaqdhm]

各キーの意味は以下の通りです。

Y: 現在のファイルを新しいバージョンで上書きする
n: このファイルはスキップする
a: このファイル以降、すべてのファイルを上書きする
q: タスクを終了する
h: ヘルプを表示する
d: 差分を表示する(diff)
m: マージツールを起動する

ここで m キーを押してEnterキーを押すと、マージツールとしてvimdiffが起動します。

※マージツールが何も設定されていない状態でmを選択すると、Please specify merge tool to THOR_MERGE env.というエラーメッセージが表示されます。

vimdiffの画面の見方とマージ作業

vimdiffを起動すると、画面が左右に分割して表示されます。

左画面 (REMOTE): タイムスタンプが付いたファイル名で、新しいRailsバージョンのテンプレートファイルが表示されます。

右画面 (LOCAL): 現在あなたのプロジェクトにあるファイルが表示されます。

画面は、ターミナルの配色設定によって異なりますが、一般的に以下のように色分けされます。

  • 異なる行: 紫などの背景色でハイライトされます。
  • 行内のさらに異なる部分: 赤などの背景色で強調されます。
  • 片方にしか存在しない行: 青などの背景色でハイライトされ、もう片方は空白行として緑などの背景色でハイライトされます。

マージ作業では、主に左画面の新しい設定内容を確認し、必要な変更を右画面の自分のファイルに反映させていきます。Vimの通常のコピー&ペーストで編集することもできますし、差分のある行で以下のvimdiff専用コマンドを使うと効率的です。

  • do (diffobtain): カーソルがある側のバッファに、もう一方のバッファの変更を取り込みます。
  • dp (diffput): カーソルがある側のバッファの変更を、もう一方のバッファに送り込みます。

マージ作業が完了したら、:wq コマンドでファイルを保存してvimdiffを終了します。すると、次のマージ対象ファイル(もしあれば)に進みます。

まとめ

普段からコーディングにVim/Neovimをお使いであれば、Railsのバージョンアップ時も使い慣れたエディタで差分マージを行うことで、作業が格段に捗るはずです。

ぜひ、vimdiffをマージツールとして活用してみてください。