Git コンフリクト解決戦略
はじめに
協調開発ではコンフリクトは不可避。本ガイドは基礎を超え、パターン・判断フレームワーク・ツール活用で効率/安全に解決する方法を示す。
コンフリクト種別
| 種類 | 例 | 原因 |
|---|---|---|
| Content | 同じ行を変更 | 並行編集 |
| Add/Delete | 片方で削除 / 片方で編集 | 分岐リファクタ |
| Rename/Edit | リネーム + 内容変更 | 大規模変更の非同期 |
| Binary | 画像双方編集 | 行単位マージ不可 |
| Directory/File | ディレクトリ ↔ ファイル 変換 | 構造再編 |
一般フロー
Detect → Classify → 意図確認 → (編集/採択) → テスト → Commit迅速な状況確認
bash
git status
git diff --name-only --diff-filter=U
git diff --mergeours / theirs 選択
bash
# 自ブランチを採用
git checkout --ours path/file.txt
# 相手ブランチを採用
git checkout --theirs path/file.txt
git add path/file.txt意味的正しさを必ず確認。
構造化手動マージ手順
- 両側変更を全文読む
- 変更意図分類 (ビジネス / フォーマット / ホットフィックス)
- 望ましい結合挙動を再構築
- マーカー削除 & テスト実行
git add→ 続行
事前の細分化コミット
bash
git add -p小さく意味の塊でコミットしコンフリクト面積を削減。
長期ブランチの戦略的 rebase
bash
git fetch origin
git rebase origin/mainツール一覧
| ツール | コマンド | メモ |
|---|---|---|
| VS Code | GUI マージエディタ | 視認性高い |
| Meld | git mergetool | 視覚 diff |
| Beyond Compare | git mergetool 統合 | 商用 |
| IntelliJ | 自動グルーピング | IDE 連携 |
マーカー例
<<<<<<< HEAD (current: main)
applyDiscount(cart, 0.10)
=======
applyDiscount(cart, discountRate())
>>>>>>> feature/dynamic-discount最終形:
js
applyDiscount(cart, discountRate() ?? 0.10)バイナリ
bash
git checkout --theirs assets/logo.png
git add assets/logo.pngまたは再生成。
中断 / 継続
bash
git merge --abort
git rebase --abort
git rebase --continueRerere 再利用
bash
git config --global rerere.enabled true過去と同型の競合解決を自動適用。
予防
| 手法 | 効果 |
|---|---|
| 統一フォーマッタ | スタイル差分排除 |
| 小型 PR | 重複編集減 |
| 早期同期 | 乖離縮小 |
| アーキ議論共有 | 重複実装回避 |
| Feature flag | 未完成でも早期統合 |
回帰安全網
bash
./run-tests.sh
git diff --check誤った解決の復旧
bash
git reflog
git reset --hard <hash>まとめ
コンフリクトは並行イノベーションの信号。体系的プロセスと衛生習慣、適切ツールで影響を最小化できる。
次へ
git-reset-revert-and-checkout-explained.mdgit-stash-and-temporary-changes.md
主要コマンド
bash
git diff --name-only --diff-filter=U
git checkout --ours <file>
git checkout --theirs <file>
git merge --abort
git rebase --continue