開発ブログ

WWWクリエイターズが送る、Git、CSS、HTML、コマンドライン、Macの便利機能など、開発に関する役立ち情報発信します。気まぐれに更新。

git mergeでの競合(コンフリクト)の解決方法のまとめ。

最終更新:2017-07-05 by Joe

git merge のコンフリクトの解決方法についてです。

gitでブランチを利用し、git mergeを使うようになったら、競合(コンフリクト)とその解決の作業を避けて通れません。

git mergeについて

まず、git mergeについてです。

git merge は、現在のブランチに対して、特定のコミットまでの歴史を統合します。実際の使用では、しばしばブランチ名を指定します。ブランチ名は、そのブランチの先頭コミットへの「参照」ですので、実際に指定されるのはコミットです。

具体的には、例えば、下記のマスターブランチ「G」に対して、topicブランチをマージすると・・・

このように、新しいコミットを「H」が結果として生成されます。A、B、Cにおける変更が、masterブランチに取り込まれます。

コンフリクトの発生

変更内容をマージにより統合する際に、もし同じファイルの重複する部分が変更されていると、変更同士が衝突し「コンフリクト」と呼ばれる状態を引き起こします。

2つの履歴のうち、どっちらのコード変更を採用すればいいの?という問題を、Git自身が決めることはできないので、開発者が指定したり、次コードを調整したりする必要があるのです。

git mergeの実行時に、コンフリクトが起きると、git mergeの処理は一時停止され、開発者にその後の処理を委ねます。これはGit において特別な状態で「merge の中断状態」となります。この時、開発者はいずれかを選択することになります。

  • コード上のコンフリクトを解決して、git commit の実行により、マージコミットをコミットする
  • いったんマージを中止して元に戻す

上記のいずれかの手段を行う以外は、他の Git 操作ができません。

コンフリクトの解消方法

それでは、解決を試みます。

[1] 競合している箇所の確認する

「git status」を行えば、コンフリクトの箇所が分かります。

Unmerged path に、コンフリクトが発生したファイルが列挙されています。

[2] 必要箇所を修正する

コンフリクトしているファイルが分かったら、直接ファイルを開いて修正していきます。ファイル内で、コンフリクト箇所は「<<<< HEAD」「====」「 >>>> topic」によってハイライトされていますので、ファイル内で「>>>>」などの連続を検索すると、問題の箇所がすぐに見つかるでしょう。

慣れていないとちょっとぎょっとしますが、恐れる事はありません。HEADが、現在のブランチです。その下が「git merge branch-B」 と対象に指定したブランチです。

これらはコード的にも成立しないので、エディタで、不要な部分を消して綺麗に整えます。

[3]コミットしなおす

コンフリクトしたすべてのファイルを慎重に修正して、git add します。

status を確認します。

Gitが「All conflicts fixed but you are still merging.」と言っています。

あなたがコンフリクトを解消して、git add を実行して、修正をインデックスにステージした事に気づいています。あとは、git commit を実行すれば、競合を解決したマージコミットの完成です。

無事、マージコミットが作成されました。

 

以上、git merge のコンフリクトの解決についてでした。

参考リンク