導入
複数人での開発において避けられないのが「コンフリクト(競合)」です。Gitでマージを行う際、同じファイルの同じ箇所が異なる内容に書き換えられていると、Gitはどちらを優先すべきか判断できず作業を中断します。多くの初心者がこの状況でパニックに陥りますが、3-way merge(3ウェイマージ)の仕組みを理解すれば、安全かつ論理的に解消できるようになります。本稿では、効率的なコンフリクト解決の作法を解説します。
基礎知識
3-way mergeとは、以下の3つの状態を比較してマージを行う手法です。
1. Base(共通の祖先):変更が分岐する前の元の状態。
2. Current(カレント):現在自分が作業しているブランチ(HEAD)の変更。
3. Incoming(インカミング):取り込もうとしている相手のブランチの変更。
これらを比較することで、「何がどう変わったのか」を特定し、機械的に統合が可能になります。VS Codeなどのモダンなエディタが提供する「Merge Editor」は、これらを視覚的に並べて選択できるようにした非常に強力なツールです。
実装/解決策
コンフリクトが発生したら、闇雲にテキストを直接編集してはいけません。以下の手順を守るのが鉄則です。
1. 現状把握:`git status`コマンドで競合ファイルを確認します。
2. エディタの活用:VS Codeであれば「Merge Editor」を開きます。左にIncoming、右にCurrent、下に解決後の結果が表示されます。
3. 選択と統合:各箇所で「Accept Current(自分を採用)」「Accept Incoming(相手を採用)」「Accept Both(両方採用)」を選択します。
4. 最終確認:マージ後のコードが意図通りに動くか、必ずテストコードを実行します。
サンプルプログラム
以下は、コンフリクトが発生した際のGit上のマーカー表現と、それを解決する際の思考プロセスを模した擬似コードです。
/
git mergeでコンフリクトが発生すると、ファイル内に以下の記号が挿入されます。
<<<<<<< HEAD は自分の変更の開始地点
======= は変更の境界線
>>>>>>> branch-name は相手の変更の終了地点
/
// --- 解決前の状態 ---
<<<<<<< HEAD
const apiEndpoint = "https://api.production.com"; // 自分の変更
=======
const apiEndpoint = "https://api.staging.com"; // 相手の変更
>>>>>>> feature-branch
/
【解決策】
どちらが必要か、あるいは両方を条件分岐させるべきか判断します。
今回は環境変数で切り替えるのがベストと判断し、以下のように修正します。
/
// --- 解決後の状態 ---
const apiEndpoint = process.env.NODE_ENV === 'production'
? "https://api.production.com"
: "https://api.staging.com";
// 解決後は git add {ファイル名} を実行し、git commit で完了させます。
応用・注意点
現場で陥りやすい失敗の一つが、「とりあえず相手のコードを消して自分のコードだけにする」という対応です。これはチーム開発において致命的なバグを生む原因になります。
また、コンフリクトが複雑すぎる場合は、一度マージを中断(`git merge –abort`)し、相手のブランチの最新を取り込んでから(`git fetch` → `git rebase`)再度マージを試みることも検討してください。ツールを使いこなすことも重要ですが、「なぜ競合が起きたのか」をコードの文脈から読み解く姿勢が、インフラ・エンジニアとして最も信頼されるスキルとなります。

コメント