159
163

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GitAdvent Calendar 2015

Day 25

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

Last updated at Posted at 2015-12-24

概要

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 は前回比較のファイルタイプを覚えているようで、ファイルタイプ指定を明示的に行わないと、全てのファイル一覧が表示されないことがある。

参考

159
163
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
159
163

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?