Edited at
GitDay 25

git の差分比較・マージを WinMerge で行う

More than 3 years have passed since last update.


概要

git diff ってやるとこういうふうに出る差分を

> git diff

diff --git a/main.cpp b/main.cpp
index 198f012..6e1f7d5 100644
--- a/main.cpp
+++ b/main.cpp
@@ -4,7 +4,8 @@
int main()
{
A a;
- printf("%X", &a);
+ printf("address = %X", &a);
+ hello();
hello();
return 0;
}

WinMerge によってグラフィカルに確認・編集できるようにする。

Image2.png

同様にマージ作業も行えるようにする。

merge2.png


環境について

今回の環境を参考までに。


  • Windows 7 Home Premium 64bit


  • WinMerge 2.4.0.68+-jp-68 (Japanese Unicode X64)


  • git version 2.6.4.windows.1


設定方法

{ユーザディレクトリ}/.gitconfig に以下を追記。

[diff]

tool = WinMerge
[difftool "WinMerge"]
path = C:/Program Files/WinMerge/WinMergeU.exe
cmd = \"C:/Program Files/WinMerge/WinMergeU.exe\" -f \"*.*\" -e -u -r \"$LOCAL\" \"$REMOTE\"
[merge]
tool = WinMerge
[mergetool "WinMerge"]
path = C:/Program Files/WinMerge/WinMergeU.exe
cmd = \"C:/Program Files/WinMerge/WinMergeU.exe\" -e -u \"$LOCAL\" \"$REMOTE\" \"$MERGED\"
[alias]
windiff = difftool -y -d -t WinMerge
winmerge = mergetool -y -t WinMerge

エイリアス名はお好きに。(今回は「windiff」「winmerge」としてみた。ツール名とバッティングしていてややこしいが…)


差分比較

ローカルリポジトリ内で、さきほど付けたエイリアスコマンドを実行。

> git windiff

windiff.png

Image2.png

するとこんな感じに WinMerge で差分比較できる。

ファイルパスはテンポラリディレクトリ内の場所を示しているが、右側の編集は自動的に作業コピーの変更として反映される。


リビジョン指定の比較

以下のようにリビジョン指定の比較も行える。

> git windiff HEAD~~~ HEAD~

revision.png


マージ

まずはコンフリクトの発生する状況を作ってみる。

> git checkout master

> git checkout -b branch1
> echo hello >> main.cpp
> git add . && git commit -m "change1"

> git checkout master
> git checkout -b branch2
> echo world >> main.cpp
> git add . && git commit -m "change2"

> git checkout master
> git merge branch1
Updating ef81702..34d9482
Fast-forward
main.cpp | 1 -
1 file changed, 1 deletion(-)

> git merge branch2
Auto-merging main.cpp
CONFLICT (content): Merge conflict in main.cpp
Automatic merge failed; fix conflicts and then commit the result.

コンフリクトが発生した。

続けてマージツールの起動を行う。(さきほど設定したエイリアス「winmerge」を用いる)

> git winmerge

merge.png

するとこんな感じに WinMerge 上でコンフリクトの解消作業を行うことができる。

一番右側のペインの編集はそのまま作業コピーに反映される。


以上

せっかく Windows を使ってるのだったら豊富なツール群の恩恵をふんだんに享受しましょう。


補足:WinMergeの引数



  • -f "*.*" … 表示するファイルタイプ


  • -e … ESCで閉じれるようにする


  • -u … 履歴に追加しない


  • -r … サブフォルダを含む比較

※どうやら WinMerge は前回比較のファイルタイプを覚えているようで、ファイルタイプ指定を明示的に行わないと、全てのファイル一覧が表示されないことがある。


参考