2026年8月19日水曜日

git と diff

業務で使用していたバージョン管理システム、単発のプロジェクトならば Subversion で十分なんだが、ベースシステムの管理には向いていなくて、「大がかりな機能追加がしたい」とか、派生が多くなると Gitの方が使いやすそうなので git も使うようになりました。 branch を切って、branch をサブブランチに切り替えて作業をしている間にも、メインブランチにバグ修正が入ったりするとメインブランチで修正とコミットをして、サブブランチに取り込みたい。
サブブランチにて
git fetch
git merge origin/master
とやる機会が増えて来ました。

使っていて、merge で CONFLICT した状況を見ると、git 付属の diff が WinMerge の diff と比べて差分の認識が悪く merge 作業が大変です。
Gemini さんに相談したところ、diff も変更できるらしいです。
git ほんと、よくできたツールだ。

以下の質問をGeminiさんに投げてみました。
git 付属の diff と比較して、WinMerge 付属のdiff の方が賢い気がしています。
同じ diff ではないのでしょうか?

結論から言うと、Git付属の git diff と WinMerge は全く異なる「差分比較エンジン(アルゴリズム)」を使用しています。 そのため、比較の「賢さ」や結果の見た目に違いが生まれます。

WinMergeのほうが賢く感じるのには、明確な技術的理由があります。

1. 内部の比較アルゴリズムが違う

行単位で大雑把に比較するか、文字単位で細かく比較するかの違いがあります。

  • git diff(デフォルト):
  • 主に「マイヤーズ(Myers)のアルゴリズム」[1] をベースにしています。
    • 行単位での変更(どの行が消えて、どの行が増えたか)を高速に探すのが得意です。
  • WinMerge:
  • 独自の高度な差分エンジン(改良されたアルゴリズム)を持っています。
    • 行単位の比較だけでなく、同じ行の中の「どの文字(単語)が変わったか」まで自動で細かく解析します。

2. WinMergeが「賢い」と感じる3つの理由

① 行内の部分一致(ハイライト)が強力

Gitは行単位で「この行が削除され、この行が追加された」と雑に判定しがちです。 WinMergeは「この行の、この変数名だけが書き換わった」のように、変更されたピンポイントの場所を明るい色でハイライトしてくれるため、脳の負担が減ります。

② 空白や改行コードの柔軟な無視

WinMergeは「スペースの数の違い」「タブとスペースの違い」「改行コード(CRLF / LF)の違い」を自動で無視する設定(または検知して警告する機能)が非常に強力です。Gitでこれらを行うには --ignore-space-change などのオプションを自分で指定する必要があります。

③ 移動した行(ブロック)の検知

コードの塊が「上の位置から下の位置へ移動しただけ」という場合、Gitは「ごっそり削除されて、別のごっそり追加された」と認識しやすいです。WinMergeは「これは移動しただけ」と見抜いて線で結んでくれる機能(移動ブロックの検出)があるため、より人間にとって直感的です。

ヒント:Git の比較画面を WinMerge に変更できます

もし WinMerge の見やすさで Git の差分を確認したい場合は、Git の外部差分ツール(difftool)として WinMerge を登録するのがおすすめです。 以下のコマンドをターミナルで実行すると設定できます:

git config --global diff.tool winmerge
git config --global difftool.winmerge.cmd '"C:/Program Files/WinMerge/WinMergeU.exe" -e -u -dl "Base" -dr "Mine" "$LOCAL" "$REMOTE"'

※WinMergeのインストールパスは環境に合わせて変更してください。 設定後は、いつものコマンドを少し変えるだけで WinMerge が起動します:

git difftool <対象ファイル>

もしよろしければ、以下を教えていただけますか:

  • お使いのPCは Windows ですか?(MacやLinuxでも一部WinMergeの派生ツールが使えます)
  • Gitのターミナル上(黒い画面)でWinMergeのように見やすく表示したいですか?、それともWinMergeのアプリを直接起動したいですか?

ご希望に合わせて、Gitの表示をより賢く・見やすくカスタマイズする手順をご案内します。