Conflict(コンフリクト)とは
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がよく発生します:
- チームメンバーが同じファイルの同じ箇所を別ブランチで変更
main
やdevelop
ブランチが頻繁に更新されている中で長期間放置されたPRgit rebase
で古い履歴に新しい変更を適用しようとした場合
特にUIロジック、ルーティング、グローバル設定ファイル(例:package.json
, routes.ts
)などはConflictが起こりやすいです。
Conflictの解決手順(基本フロー)
-
対象ファイルを開く
Gitは競合箇所を次のように表示します:<<<<<<< HEAD 自分の変更内容 ======= 他ブランチの変更内容 >>>>>>> feature/other-branch
-
どちらの変更を残すか判断し、手動で修正
-
修正後、ファイルをステージング
git add main.js
-
マージ完了をGitに伝える(マージの場合)
git commit
または、rebase中の完了操作:
git rebase --continue
実務での対策と防止策
✔ PRを定期的に最新ブランチに追従させる
- 長期放置されたPRはConflictの温床
- チームルールとして「週1回
main
をマージ/rebase」などの運用を設定
✔ ファイルの分割・責務分離
- 複数人で頻繁に触るファイルは機能単位で分割しておくとConflictが起こりにくい
settings.js
→settings/user.js
,settings/theme.js
のように分離するのが有効
会話例:レビュー時のConflict通知
Reviewer:
このPR、mainとConflictしてます。先に解消してもらえますか?
Developer:
了解です。main取り込んで rebase してから再Pushします。
注意点:解消したつもりがロジック破壊になっていることも
Conflictは技術的には解消されても、ビジネスロジックやUI整合性が壊れてしまっていることが少なくありません。
解決後のセルフチェック例
- 期待する値が残っているか?
- 重要なテストケースが削除されていないか?
- 前後処理の整合性が取れているか?
まとめ:Conflictは「人間の判断」を必要とする合流地点
- コンフリクトはGitが判断できない“選択”を開発者に委ねている状態
- 単なる技術的処理ではなく、設計・ロジックの整合性まで確認する責任が伴う
- チームとしての予防設計と、落ち着いた解決が大切