競合の解決 [Git]
競合とはなにか
複数のブランチ上で同じファイルに変更を加えたとき、それらのブランチをマージしようとすると「競合」が起こります。同じファイルであっても別々の場所が変更されているのならば、自動的にマージされて問題にはなりません。しかしファイルの同じ箇所が変更されているときには手作業で競合を解決する必要があります。
どのように行うのか具体的に見てみましょう。
競合が自動的に解決される場合
右の図TortoiseGitでログを表示したものです。「master」と「rachi/001」の2つのブランチ上で同じ「_color_tables.scss」ファイルが変更されていることを示しています。
masterでの変更はファイルの5行目に新しい行を追加するものです。またrachi/001では15行目に新しい行を追加しています。
同じファイルが変更されていても別々の箇所ですので自動的にファイルがマージされます。
右の図はmasterにrachi/001をマージした結果です。ファイルが自動的にマージされ、rachi/001で追加した一行が反映されたことを示しています。
競合を手作業で解決する場合
今度は両方のブランチで_color_table.scssファイルの5行目に変更を加えます。
今度は自動マージが失敗してしまいます。同じ行が変更されているため、どのようにマージすればいいのか自動では判断することができないのです。
競合したファイルを開いてみると、右の図のようになっています。競合した5行目には区切りが加えられmasterにおける行(HEAD 最新の内容を表す)とrachi/001における行がそれぞれ出力されています。「<<<<<<<」と「>>>>>>>」に囲まれた間を編集して2つの変更を一つにまとめなければなりません。
変更は普通のエディタで行ってもかまいませんがTortoiceMarge(TortoiseGitに附属)やWinMargeなどのマージツールを使うと簡単です。右の図はWinMargeで_color_table.scssファイルを開いたものですが、マージする前の2つのファイルが再現されて異なる箇所が強調されています。右側の「Mine File」を編集して保存すれば編集は終わりです。
ファイルの編集が終わったら先ほどの実行結果ダイアログの[競合の解決]ボタンか右クリックメニューの[Git | 解決する...]をクリックします。コミットダイアログが表示されるのでOKをクリックすれば、コミットが実行されて競合状態が解決します。
結果は右のように、無事コミットが行われました。
htmlなどのテキストファイルであればこのように作業できますが、イラストレータなどのバイナリファイルでは、アプリでファイルを開いて編集しなければなりません。複雑な作業が必要となるのでできるだけ競合が起きないように注意をしてください。