コンフリクトが発生する場合
- マージ(コミットのマージ)
- リバート(コミットの打ち消し)
- リベース
- プル
特に、発生する例としてわかりやすいのはソースコード同士をマージしている際に同じ箇所を別々のブランチで同じ箇所を修正して発生するケースではないでしょうか。
コンフリクトが発生する条件
マージする2つのブランチが同じファイルの同じ箇所に異なる変更を加えた場合(Gitはマージ方法を判定することができない)
なお、実際にコンフリクトが発生するタミングとしては、プルリクエストを実行したがmasterブランチへのマージはまだしてない状態の2つのブランチがあった場合になります。
コンフリクトした際に出る記号まとめ
コンフリクトが発生した場合はソースコード内に下記のような記号が記述されます。意味を理解しましょう。
記号 | 意味 |
---|---|
<<<<<<< HEAD | 自分の現在使用中ブランチによる変更の開始位置 |
======== | 使用中ブランチによる変更と、コンフリクト先の変更の境目 |
>>>>>>> コンフリクト先ブランチ名 | コンフリクト先ブランチの変更の終了地点 |
「<<<<<<< HEAD 〜 ========」が自分のブランチでの変更分、「======== 〜 >>>>>>> コンフリクト先ブランチ名」がマージ先のブランチでの変更分になります。
コンフリクトが実際に起きたソースコードの例
1 2 3 4 5 6 7 8 9 |
<tr> <td>XXXX</td> <<<<<<< HEAD <td>目指せ脱初心者!!</td> ======= <td>ガミくん</td> <td>YYY</td> >>>>>>> master </tr> |
なお、これらの記号はコンフリクトを解消させる場合は不要なものなので必ず削除するようにしましょう。
コンフリクトを解消する流れ
- ソースコードを適切にマージして修正する。(コンフリクト記号の削除は忘れないようにしましょう。)
- ステージングエリアに追加し、コミットをする。
- リモートリポジトリにプッシュをする。
- プルリクエストをする。(マージが適切に行われていればGitによる自動マージが行えるようになっています。)
コンフリクトを起こさないための運用ルール
複数人で同じファイルを編集しないこと。
マージをする前に変更中の状態をなくすこと。
そもそも、自分のブランチで変更中のファイルがある場合はマージができません。
変更中のファイルはなくすようにしましょう。(具体的にはcommitやstash(変更中のファイルを一時保管するためのコマンド)をするようにしましょう。)
pullをする際はpullするブランチに移動してから実施すること
pullの仕様として現在所属しているブランチにそのままマージされるという仕様になっているためです。
この記事へのコメントはありません。