コンフリクト

Gitでは、ブランチを切り替えて作業をしていくことが多いです。

しかし、ブランチの切り替えは必ずしも簡単にできるというわけではありません。

さらに、過去のマージの説明の際に、同じ場所を変更しているとコンフリクトが発生するということを説明しました。

このように、ブランチの操作は場合によってはうまくいきません。

ここでは、マージの際に発生するコンフリクトやブランチの切り替えで気をつけることを紹介します。

修正

最初に、ブランチのマージの時にコンフリクトが発生した時の対処法を紹介します。

マージの時にコンフリクトが発生すると、下記のようなメッセージが表示されてコンフリクトが発生したことを教えてくれます。

Automatic merge failed; fix conflicts and then commit the result.

表示されているメッセージから分かるように、コンフリクトを修正してからコミットをすることでコンフリクトを解決します。

この状態でgit statusコマンドを実行すると、コンフリクトの修正方法が書かれています。

You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

ここから、2つのことが分かります。

ひとつは、コンフリクトを修正したらgit commitコマンドを実行することです。

ふたつめは、マージを中止したい場合はgit merge --abortコマンドを実行することです。コンフリクトが発生すると、マージが途中で止まってしまうので、その途中までの結果も含めてなかったことにできます。

ファイルの修正

コンフリクトが発生したファイルは、git statusで確認でき、both modified:という状態のファイルがコンフリクトが発生したファイルです。

そのようなファイルを開くと、このようになっていると思います。

<<<<<<< HEAD
マージ先のブランチの変更
=======
マージ元のブランチの変更
>>>>>>> マージ元のブランチ名

<<<<<<< HEAD>>>>>>> マージ元のブランチ名で、コンフリクトが発生した場所が分かりやすいようになっています。

修正は、これらの内いらない部分を削除して、コミットしても構わない状態にします。なので、<<<<<<< HEAD>>>>>>> マージ元のブランチ名なども削除してしまいます。

コミット

修正が終わったら、git addで、コンフリクトを修正したファイルを追加します。

そして、git commitで修正をコミットします。

git commitでのコミットは、git commit -mのコミットとは違い、コミットメッセージを編集する画面が表示されます。

マージの最中の場合は、適切なコミットメッセージをGitの方で選んでいるので、変更する必要性は少ないと思います。

変更しないのであれば、起動しているエディタにもよりますが、通常はviと呼ばれるエディタが使われていると思います。

viの場合、キーボード上で「:wq」と入力してエンターキーを押すと、エディタを閉じることができます。:wqという入力は左下に表示されます。

git commitで、中断していたマージが再開され、これでコンフリクトの修正が終わりという場合もありますが、またマージの途中でコンフリクトが発生することがあります。そのような場合は、同じようにコンフリクトを修正していきましょう。

ブランチの切り替え

マージのコンフリクトと同じように、git checkoutでブランチを切り替える際にも、うまく切り替えることができない場合があります。

どのような時に切り替えができないのかというと、変更を加えてコミットしていないModifiedな状態のファイルがあり、切り替えた先のブランチでそのファイルと同じ部分を変更している場合です。その他に、ひとつでもgit addでファイルの状態をStagedにしている場合があります。

このような時に、ブランチを切り替えることができるようにするには、その変更をコミットするか、変更を元に戻してしまうという2つがあります。

状況に応じて、どちらかの方法を選択します。

まとめ

ブランチやマージを使うということは、常にコンフリクトが起きるかもしれないということを覚えておく必要があります。

しかし、コンフリクトが発生したとしても、慌てずにひとつひとつ修正してコンフリクトを解消していきましょう。