プルリクした瞬間…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」を選択しておきます。(下記図参照)
選べない場合は、「カスタム」を選択して、「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にもコンフリクト解消ツールがありますが、ここはいったんSourceTreeに戻ります。
masterブランチに切り替えて、developをマージします。
ここでも、コンフリクトが発生しています、と表示されます。
この、エクスクラメーションがついているファイルを右クリックし
「競合を解決」→「外部のマージツールを起動」
とします。すると、TortiseMergeが起動します。
次のような画面になります。赤い部分がコンフリクトです。
私がTortiseMergeで気に入っているのは、この下の図で赤丸で表示してある、右上の「Use ‘therirs’ text block」という機能たちなのですが、
・相手の変更を使う
・自分の変更を使う
・相手の変更を使った後に自分の変更を使う
・自分の変更を使った後に自分の変更を使う
などができます。一番下にプレビューが出ます。
今回は、「Use theirs block then mine(相手の変更を使って、それから自分の変更を使う」を使います。
赤くなっている行を選択し、 「Use theirs block then mine 」のボタンをクリックしてください。
次のようになったら、
これでコンフリクトを解消したことにするため、「Mark as resolved」ボタンをクリックして「Save」をクリックします。
TortiseMergeを終了して、SourceTreeに戻ります。
すると、下記の図のように、エクスクラメーションマークがなくなっています。(注意:何も変更していなくても、外部のマージツールから戻ると、このようになっているので、コンフリクトが解消されたかどうかをSourceTreeが見ているわけではなく、ただ単に 外部のマージツールから戻ると こうなってます。)
修正内容をもう一度確認し。コミットします。
Githubでも確認すると、下記の図のように
「Successfully merged…」
となっていて、無事にマージされたことがわかります!!
やったね⊂(^-^)⊃