Visual Studio を diff / merge ツールとして使う

Git などのバージョン管理システムを用いるにあたり重要な機能はマージであり、避けられないのはコンフリクトです。私は rebase 教徒なのでマージではないかもしれませんが…いずれにせよ、コンフリクトからは逃れられない。こればかりは仕方ありません。

Windows においてグラフィカルにコンフリクトを解決するためのツールは数多く…と言いたいところですが、決して多くありません。どれが使いやすいかというと、うーん…一長一短ということにしておきたい感じです (私見)。そんな中、Visual Studio をマージ ツールとして使うことができ、触り心地も悪くない感じです。Windows 環境のマージ ツールでお悩みの方は、一度試してみては如何でしょうか。

Visual Studio as a (Diff / Merge) Tool

とりあえず、百聞は一見に如かずということで、どんな具合に表示されるかをスクリーン ショットで紹介してしまいます。

  • diff (2 ペイン表示): Visual Studio as a difftool (split)
  • diff (インライン表示): Visual Studio as a difftool (inline)
  • merge: Visual Studio as a mergetool

こんな感じでグラフィカルに (当然だ) 差異を表示してくれます。コンフリクトの解決も、hunk 部分の左側にあるチェック ボックスをトグルすることで簡単に採用させることができます。

まあ、普通のマージ ツールなんですが、ちゃんと一通りのことを直観的に操作できる感じでして、結構いい感じではないかなと個人的には思います。あくまで主観的な話なので、誰にでもマッチするかというと、まあ…そういう感じでもないとは思いますが、冒頭でも述べた通り、Windows のグラフィカル環境で一通りちゃんと処理できるマージ ツールの絶対数がそこまで多くはないという感じなので (片手でぎりぎり収まるくらいか?)、折角なので一度試してみてほしいかな、とは思います。

Git で Visual Studio をマージ ツールに登録する

Git で Visual Studio を diff / merge ツールとして登録するには、以下の設定を .gitconfig なりに記述してやります (注: 水平方向に長いです):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[diff]
tool = vsdiffmerge
[merge]
tool = vsdiffmerge
[difftool "vsdiffmerge"]
cmd = \"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Common7\\IDE\\vsdiffmerge.exe\" \"$LOCAL\" \"$REMOTE\" //t
keepbackup = false
trustexitcode = true
[mergetool "vsdiffmerge"]
cmd = \"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Common7\\IDE\\vsdiffmerge.exe\" \"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\" //m
keepbackup = false
trustexitcode = true

上の内容もググれば出てくるといえばその通りなのですが、あんまり日本語の情報で残ってないのと、会社内で何回か聞かれたりもしたので、まあ、ぎりぎり有用情報の範囲内かな…という感じです。

あと、当然ですが、Visual Studio のパスは適宜修正してください。

以下は .gitconfig とかじゃなくて、(SourceTree みたいなのの) 設定ダイアログ内のテキスト ボックスとかでコピペする用です。

1
2
3
4
# difftool
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\vsdiffmerge.exe" "$LOCAL" "$REMOTE" /t
# mergetool
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\vsdiffmerge.exe" "$REMOTE" "$LOCAL" "$BASE" "$MERGED" /m

少し脇道に逸れまして、devenv.exe じゃなくて vsdiffmerge.exe なんですね…っていう話なんですが、このヘルパ プログラムを介してやることで、既存の Visual Studio インスタンス上で差異を表示してやるためのものみたいです (当然、既存のインスタンスが存在しない場合は新しく devenv.exe が起動する)。

残念なところ

あんまり褒めちぎっても仕方ないので、少し残念なところについても言及しておきます。

  • 上掲のスクリーン ショットでもよく見れば判るのですが、diff と merge で微妙に機能の有効化状況に差が…換言すれば、両機能間での統一性には若干の難があるみたいです。例ではまあ、例えば merge の方では Web Essentials による Markdown のシンタックス ハイライトが動いてますが、diff の方はそうではありません(これが例えば C# だとちゃんと表示されるんですけどね)。
    拡張が色々動いてたり、配色が色々カスタマイズされたままですみません…まあ、素の状態でも大筋には差はない…はずということで、平にご容赦ください。
  • 相対的に重いです。まあ、これも主観的な観点ですし、どこまで許容できるか、という話に尽きるのですが…少なくとも WinMerge よりは確実に立ち上がりまでに時間が掛かります。

以上を踏まえても、使いやすさと表示の洗練具合については他のツールより優れており、十分選択に値すると私は考えています。

まとめ

私はいつまで経ってもコンフリクトの解決が不得手、というか苦手意識が抜けなかったのですが、vsdiffmerge を知ってからは随分と心が楽になりました。

割と便利で使いやすく、綺麗に出来ていると思うので、使ったことない方は是非一度でも試してみてほしい機能です。