衝突を解消する
テクノロジ系 / conflict — コンフリクト解消
衝突を解消する
— コンフリクトはエラーではない —
このトピックが終わると
- コンフリクトがなぜ起きるか説明できる
- コンフリクトマーカーを読める
- VS Code でコンフリクトを解消できる
- 解消後に
git add→git commitできる
章 1 — コンフリクトはなぜ起きるか
同じ行を2人が別々に変更した
[元のファイル] [Aさんの変更] [Bさんの変更] return "Login failed" return "ログイン失敗" return "Login error"
Aさんの feature/login
──●──●──●
/ \
main ─● ? ← どちらを残すか Git には判断できない
\ /
──●──●──●
Bさんの feature/mypageGit は「人間に決めてほしい」と止まる。これがコンフリクト。
コンフリクトはエラーではない
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 commitVS 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 IDEA | Java 系プロジェクトで標準的 |
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 を自動化に繋げる