採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

衝突を解消する

テクノロジ系 / conflict — コンフリクト解消

衝突を解消する

— コンフリクトはエラーではない —

このトピックが終わると

  • コンフリクトがなぜ起きるか説明できる
  • コンフリクトマーカーを読める
  • VS Code でコンフリクトを解消できる
  • 解消後に git addgit commit できる

章 1 — コンフリクトはなぜ起きるか

同じ行を2人が別々に変更した

[元のファイル]           [Aさんの変更]      [Bさんの変更]
return "Login failed"  return "ログイン失敗"  return "Login error"
         Aさんの feature/login
        ──●──●──●
       /              \
main ─●                ? ← どちらを残すか Git には判断できない
       \              /
        ──●──●──●
         Bさんの feature/mypage

Git は「人間に決めてほしい」と止まる。これがコンフリクト。

コンフリクトはエラーではない

CONFLICT (content): Merge conflict in login.php
Automatic merge failed; fix conflicts and then commit the result.

Git が正直に「判断できない」と教えてくれているだけ。

→ 壊れたわけではない。

→ 落ち着いて「どちらを残すか」を決めるだけ。

章 2 — マーカーを読む

コンフリクトマーカーの構造

<<<<<<< HEAD
  return "ログイン失敗"       ← 自分のブランチの内容
=======
  return "Login error"       ← 相手のブランチの内容
>>>>>>> feature/mypage
マーカー意味
<<<<<<< HEADここから自分の変更
=======境界線
>>>>>>> <branch>ここまで相手の変更

章 3 — 解消の手順

解消の3ステップ

1. マーカーを見て「どちらを残すか」決める
         ↓
2. マーカー行(<<<, ===, >>>)を削除して保存
         ↓
3. git add → git commit

VS Code での解消(推奨)

コンフリクトがあるファイルを VS Code で開くと

選択ボタンが表示される。

ボタン意味
Accept Current Change自分の変更を残す
Accept Incoming Change相手の変更を残す
Accept Both Changes両方残す

ボタンをクリックするだけでマーカーが自動で消える。

解消後の commit

# 解消済みファイルをステージ
git add login.php

# コンフリクト解消のコミット
git commit -m "merge: feature/mypage のコンフリクトを解消"

メッセージは自動生成されることもある(そのままでよい)。

マージを中断する(git merge --abort)

解消が難しい・やり直したいときはマージ自体を取り消せる。

# コンフリクトが発生した状態で
git merge --abort
CONFLICT → マーカーが出た状態
  ↓
git merge --abort
  ↓
マージ前の状態に戻る(何も変わっていない)

「どちらを残すか判断できない」時は一度止めて相談しても良い。

mergetool:専用エディタで解消する

git mergetool
ツール特徴
VS Code組み込みで使える(git config merge.tool vscode
vimdiffターミナルのみで完結
IntelliJ IDEAJava 系プロジェクトで標準的

VS Code を mergetool に設定する

# VS Code を mergetool として設定
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait $MERGED'

設定後は git mergetool を実行すると VS Code が起動し、

3ペイン(自分・共通祖先・相手)で視覚的に解消できる。

コンフリクトを減らすには

対策効果
こまめに pull する差分が小さいうちに同期する
1ブランチ1機能変更範囲を絞って衝突を減らす
同じファイルを複数人で触らない担当を明確にする

コンフリクトはチームで開発している証拠。

避けるより、素早く解消できることの方が重要。

まとめ

コンフリクト発生
  ↓
git status でどのファイルか確認
  ↓
マーカー(<<<, ===, >>>)を見て解消
  ↓
git add → git commit

→ 次のトピック cicd で push を自動化に繋げる