Ruby on Railsのバージョンをアップデートする際、rails app:updateというタスクで設定ファイルなどを更新します。このとき、既存のファイルと新しいバージョンのファイルをマージ(統合)する必要があります。
本記事では、このマージ作業のツールとしてvimdiffを使うための設定方法と基本的な使い方を解説します。
目次
- マージツール設定方法
THOR_MERGE環境変数を使う方法- Gitでマージツールを設定する方法
- vimdiffの起動
- vimdiffの画面の見方とマージ作業
- まとめ
マージツール設定方法
rails app:update は内部で ThorというGemを使用しています。
Thorは、コンフリクトが発生した際にどのマージツールを起動するかを、以下の順で決定します。
THOR_MERGE環境変数- Gitのマージツール設定(
git config merge.tool)
両方が設定されている場合は、THOR_MERGE環境変数の値が優先されます。
THOR_MERGE環境変数を使う方法
この方法は、Gitのグローバル設定を変更したくない場合や、特定のプロジェクトやその場限りでマージツールを指定したい場合に便利です。
一時的に指定して実行する
最も簡単な方法は、コマンドの実行時にだけ環境変数を指定することです。
# Bash
THOR_MERGE=vimdiff rails app:update
このように実行すると、このコマンドの実行中だけ THOR_MERGE が vimdiff に設定されます。
常に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をマージツールとして活用してみてください。
