プルリクした瞬間…Not able to merge と出てコンフリクトしまう… それはプログラマにとって悪夢の始まりですよね!! コンフリクトを解消するのは神経も使うし、間違うと悲しいことになるので、難しい作業です。(>_<) というわけで、なるべくこの苦痛な「コンフリクトを解消する」作業をうまくやるために、皆さんどうしていますか?
私は、GitのクライアントがSource Tree、コンフリクト解消ツールはTortoise Mergeを使っています。
コマンドラインでどうにかするのもカッコがいいとは思いますが、こういう時は視覚的にわかりやすいのが一番 というのが私のポリシーです。(`・ω・´)
まずは、下準備として、TortiseMerge(トートイズマージ:実際にはTortoise SVNをダウンロード・インスコする)をインストールして使えるようにしておきます。 ココからバージョン番号が大きいのを選びましょう。↓https://osdn.net/projects/tortoisesvn/storage/ で、ここで、 「は? TortiseMergeとか、Tortoise SVNとか旧世代の遺物じゃん!なぜ今更そんなの使うのー??そもそもGitのコンフリクトの話でなんでSVN出てくるんだよ!!」
と皆さん思われたことでしょう…。(>_<)
わかる、わかるよ…。
しかし、 TortiseMerge が意外といいんですよ。 ・見やすい ・シンプル ・マージするときに重要な「あっちのも使うしこっちのも使う」「こっちのだけ使う」「あっちのを使う」などがボタン操作で簡単 ・SVNと関係なく、 Tortise Merge は使える ・無料
そして、最大の理由が私は高解像度モニターを使っているので、WinMergeだと設定などが消えてしまったり字がちいさすぎて使いづらい(>_<) ここは最終的には好みもあるでしょうから、高解像度モニタではない人は、WinMergeでもいいんじゃないでしょうか。
本題に戻りまして、TortiseMergeが使えるようになりましたら、SourceTreeの
「ツール」→「オプション」→「Diff」で「外部マージツール」で「TortoiseMerge」を選択しておきます。(下記図参照)
SourceTreeのマージツール設定画面
選べない場合は、「カスタム」を選択して、「Diffコマンド」のところに TortoiseMerge のexeのパス、引数に
「-base:\”$BASE\” -mine:\”$LOCAL\” -theirs:\”$REMOTE\” -merged:\”$MERGED\”」
と入れておきます。
で、コンフリクトしているファイルのサンプルとして、次のようなファイルがあるとします。
①masterブランチにあるphpinfo.phpというファイル
<?php
//テストなの? 新一ー!!
phpinfo();
//test
?>
②developブランチにあるphpinfo.phpというファイル
<?php
//テストだっちゅーの!!!
phpinfo();
//test
?>
というわけで、3行目のコメントの部分がコンフリクトですね。
まずはWeb上のGithubでdevelopからmasterにプルリクを作ります。 下記のように、コンフリクトして、そのままマージできません、とでますね。
Github プルリクエストした時にコンフリクトが生じる画面
Githubにもコンフリクト解消ツールがありますが、ここはいったんSourceTreeに戻ります。 masterブランチに切り替えて、developをマージします。 ここでも、コンフリクトが発生しています、と表示されます。
SourceTreeでのコンフリクトしているファイルの表示
この、エクスクラメーションがついているファイルを右クリックし
「競合を解決」→「外部のマージツールを起動」
とします。すると、TortiseMergeが起動します。
次のような画面になります。赤い部分がコンフリクトです。
TortiseMergeコンフリクトしているファイル
私がTortiseMergeで気に入っているのは、この下の図で赤丸で表示してある、右上の「Use ‘therirs’ text block」という機能たちなのですが、 ・相手の変更を使う ・自分の変更を使う ・相手の変更を使った後に自分の変更を使う ・自分の変更を使った後に自分の変更を使う などができます。一番下にプレビューが出ます。
Use theirsという機能のボタン
今回は、「Use theirs block then mine(相手の変更を使って、それから自分の変更を使う」を使います。
赤くなっている行を選択し、 「Use theirs block then mine 」のボタンをクリックしてください。
次のようになったら、
TortiseMerge マージした画面
これでコンフリクトを解消したことにするため、「Mark as resolved」ボタンをクリックして「Save」をクリックします。
TortiseMergeを終了して、SourceTreeに戻ります。
すると、下記の図のように、エクスクラメーションマークがなくなっています。(注意:何も変更していなくても、外部のマージツールから戻ると、このようになっているので、コンフリクトが解消されたかどうかをSourceTreeが見ているわけではなく、ただ単に 外部のマージツールから戻ると こうなってます。)
修正内容をもう一度確認し。コミットします。
SourceTreeでのマージされたファイルの表示
Githubでも確認すると、下記の図のように
Githubでマージが成功したことを表示する画面
「Successfully merged…」
となっていて、無事にマージされたことがわかります!!
やったね⊂(^-^)⊃