Conflict(コンフリクト)とは

意味と技術的な定義

Conflict(コンフリクト)とは、Gitでマージやリベースなどの統合作業を行う際に、同じファイルの同じ行に複数の変更が加わっており、どちらを適用すべきかGitが自動で判断できない状態を指します。

この状態が発生すると、Gitは次のようなメッセージを出し、手動解決を求めて処理を停止します。

Auto-merging main.js
CONFLICT (content): Merge conflict in main.js
Automatic merge failed; fix conflicts and then commit the result.

なぜConflictが起こるのか:発生の背景

以下のような状況でConflictがよく発生します:

  • チームメンバーが同じファイルの同じ箇所を別ブランチで変更
  • maindevelop ブランチが頻繁に更新されている中で長期間放置されたPR
  • git rebase で古い履歴に新しい変更を適用しようとした場合

特にUIロジック、ルーティング、グローバル設定ファイル(例:package.json, routes.ts)などはConflictが起こりやすいです。

Conflictの解決手順(基本フロー)

  1. 対象ファイルを開く
    Gitは競合箇所を次のように表示します:

    <<<<<<< HEAD
    自分の変更内容
    =======
    他ブランチの変更内容
    >>>>>>> feature/other-branch
  2. どちらの変更を残すか判断し、手動で修正

  3. 修正後、ファイルをステージング

    git add main.js
  4. マージ完了をGitに伝える(マージの場合)

    git commit

    または、rebase中の完了操作:

    git rebase --continue

実務での対策と防止策

✔ PRを定期的に最新ブランチに追従させる

  • 長期放置されたPRはConflictの温床
  • チームルールとして「週1回 main をマージ/rebase」などの運用を設定

✔ ファイルの分割・責務分離

  • 複数人で頻繁に触るファイルは機能単位で分割しておくとConflictが起こりにくい
  • settings.jssettings/user.js, settings/theme.js のように分離するのが有効

会話例:レビュー時のConflict通知

Reviewer:
  このPR、mainとConflictしてます。先に解消してもらえますか?
Developer:
  了解です。main取り込んで rebase してから再Pushします。

注意点:解消したつもりがロジック破壊になっていることも

Conflictは技術的には解消されても、ビジネスロジックやUI整合性が壊れてしまっていることが少なくありません。

解決後のセルフチェック例

  • 期待する値が残っているか?
  • 重要なテストケースが削除されていないか?
  • 前後処理の整合性が取れているか?

まとめ:Conflictは「人間の判断」を必要とする合流地点

  • コンフリクトはGitが判断できない“選択”を開発者に委ねている状態
  • 単なる技術的処理ではなく、設計・ロジックの整合性まで確認する責任が伴う
  • チームとしての予防設計と、落ち着いた解決が大切

関連用語