Git コンフリクト解決: マージコンフリクトを解消する
git のマージコンフリクトを特定・理解・解決する方法をステップバイステップで解説。コンフリクトマーカー、解決戦略、ツールの使い方を紹介します。
git mergetool詳細な説明
マージコンフリクトとは?
マージコンフリクトは、2つのブランチの差分を Git が自動的に解決できない場合に発生します。これは同じファイルの同じ行が、各ブランチで異なる方法で変更された場合に起こります。
コンフリクトマーカー
コンフリクトが発生すると、Git は影響を受けたファイルにマーカーを挿入します:
<<<<<<< HEAD
const apiUrl = "https://api.production.com";
=======
const apiUrl = "https://api.staging.com";
>>>>>>> feature/new-api
<<<<<<< HEAD: 現在のブランチのバージョン=======: 区切り線>>>>>>> feature/new-api: 取り込み先ブランチのバージョン
解決の手順
- コンフリクトのあるファイルを特定する:
git status
# "both modified" のファイルが表示される
各ファイルを開き、正しいバージョンを選択する(または両方を組み合わせる)。
コンフリクトマーカーを削除する —
<<<<<<<、=======、>>>>>>>の行を削除する。解決済みのファイルをステージする:
git add src/config.ts
- merge または rebase を続行する:
git merge --continue
# または
git rebase --continue
マージツールの使用
# マージツールを設定する(例: VS Code)
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait $MERGED'
# ツールを起動
git mergetool
Merge の中止
やり直したい場合:
git merge --abort
# または
git rebase --abort
予防戦略
- main を自分のブランチに頻繁に merge することで差分を小さく保つ。
- コミットを小さく集中的に保つ — 大きなコミットは merge が難しくなる。
- 同じファイルを扱うときはチームメイトとコミュニケーションをとる。
- コードオーナーシップ(CODEOWNERS ファイル)を使って変更の重複を減らす。
コンフリクトはコラボレーションの自然な一部です。重要なのは、完全に避けることではなく、迅速かつ正確に解決することです。
ユースケース
2人の開発者が別々のブランチで同じ設定ファイルを変更し、プルリクエストの merge 時にコンフリクトが発生して、merge を完了する前に手動での解決が必要になる場面で使用します。