衝突を解決しよう
どうしても避けられなかった衝突の修正の仕方。
衝突(Conflict)とは?
2つのブランチをマージするとき、それぞれのブランチで、全く同じファイルの全く同じ行を、まったく違う内容に修正していた場合、衝突(Conflict)が起こります。
Gitはそれをどう解決してくれるのか?といえば、自動で解決はしてくれません。
マージの途中で止まって、マニュアルで修正を要求されます。
基本的に衝突は起こさないようにする
衝突が起こる条件は、
- まったく同じファイル
- まったく同じ行
- まったく違う修正
この3つの条件を全て満たしてしまった時に起こります。
つまり、逆を言えば、いずれかの条件を1つでも満たさなければ、衝突は起こりません
- ファイルを分ける
- 行を分ける
- まったく同じ修正に直す
が、衝突を起こさないための方法です。
3は、たまにやることはありますが、常用的ではないので(笑)1と2を心がけます。
lesson1で言及した、ログで見やすくなるソースコードと条件が同じです。
衝突が起こってしまったら
マージの途中で、処理が止まり「解決してほしい」と、Gitに問いかけられるので、コードを修正します。
マウス操作のみで修正
シンプルに、Aのブランチ、Bのブランチ、どちらの行を選択しますか? というような修正の場合、マウス操作でポチポチ選択していくことが出来ます。
コードを直接編集して修正
コードの衝突場所によっては、マウス操作では修正が難解になることがあります。
その場合は、コードを直接テキスト編集して修正する方が無難です。
初めて衝突部分を見に行くと、以下のような見慣れないテキストが追加されていて面食らうかもしれませんが、冷静に見てみると、難しいことはありません。
<div>
<<<<<<< HEAD
ベースブランチの変更
=======
マージするブランチの変更
>>>>>>> branch-name-hogehoge
</div>
<<<<<<< HEAD
、=======
、>>>>>>> branch-name-hogehoge
が、競合を表現しているマーカーです。
マーカーと、要らない方の変更を削除しましょう。
<div>
マージするブランチの変更
</div>