画像ツール一覧

コンフリクト

Conflict

DEVELOPMENT

コンフリクトは、変更を自動統合する際に、ツールが結果を決められない競合です。Gitでは同じ箇所の異なる編集のほか、片方で削除したファイルをもう片方で変更した場合などにも起こります。同じ時刻に作業したことが条件ではありません。

🐾 猫で例えると?

アメショと茶トラが激しく前足を突き出し合ってキャットファイトをしている写真
譲れない戦いがここにある(同時編集による競合状態)

譲れない様子の2匹を、両方の変更の意図を確かめる必要がある状態に見立てています。変更履歴を管理するGitが停止して壊れたわけではなく、判断できない箇所を知らせて人の解決を待っています。

🐾 PR

💻 アプリ・Web開発における「コンフリクト」とは?

開発現場では、主にGitやSubversionといったバージョン管理システムでソースコードを統合(マージ)する際に頻発します。例えば、エンジニアのAさんが「ボタンの色を赤にする」とコードを書き換え、同じタイミングでBさんが同じファイルの同じ行を「ボタンの色を青にする」と書き換えてしまったとします。

それぞれの環境では正常に動いていても、いざ2人のコードを1つのシステムに合流させようとした時、Gitは「同じ場所が違う内容で変更されているけど、どっちを正として上書きすればいいの?」と判断できなくなります。これがコンフリクトです。この状態に陥ると、自動での統合プロセスは中断され、人間が手動でソースコードを確認して「どちらのコードを残すか」を決定するまで先に進めなくなります。

⚠️ コンフリクトの仕組みと注意点

Gitのマージコンフリクトは、変更を自動で統合できず、人による判断が必要な状態です。むしろ「人間同士の意図のぶつかり合いを、システムが事前に検知して上書き事故を防いでくれた状態」と言えます。もしコンフリクトが起きずに勝手に上書きされてしまったら、Bさんの変更がAさんの変更を消し去る(デグレを起こす)大惨事になりかねません。

Gitにおけるコンフリクトの見え方

Gitのテキスト上の競合では、次のようなマーカーが入る場合があります。バイナリや削除・改名の競合では同じ表示にならないこともあるため、git statusでも対象を確認します。

<<<<<<< HEAD
<button class="bg-red-500">送信</button>
=======
<button class="bg-blue-500">送信</button>
>>>>>>> feature/blue-button

通常のマージではHEAD側が現在のブランチ、下側が取り込む側の変更です。ただしrebaseなどでは「自分側・相手側」の見え方が直感と異なる場合があります。意図に合う最終コードを作ってマーカーを消し、git addで解決済みを記録してから、実行中の操作に応じてマージやrebaseを続けます。

🛠️ コンフリクトを賢く使うためのポイント

変更を小さく共有し、作業内容をすり合わせると、大きな衝突を減らす助けになります。チームでは次の点を確認します。

猫同士がぶつかったときに様子を見るように、コンフリクトも両方の変更意図を確認して解消します。区切り記号を消すだけで終わらず、統合後のコードが意図した動作をするかをテストするところまでが解決です。