Git merge conflictの解決方法|初心者向け完全ガイド

Git

Git merge conflictの解決方法|初心者向け完全ガイド

Gitでバージョンコントロールをしているときにmerge conflictに遭遇したことはありませんか?このエラーはチーム開発では頻繁に起こりますが、正しい知識があれば簡単に解決できます。本記事では、merge conflictの原因から解決方法まで、初心者向けに詳しく説明します。

  1. Git merge conflictとは
  2. 原因の詳しい説明
    1. 1. 同じファイルの同じ行を複数人が編集した場合
    2. 2. ファイルの削除と編集の競合
    3. 3. 複雑なマージシナリオ
  3. Git merge conflictの解決手順
    1. ステップ1:現在のブランチを確認する
    2. ステップ2:マージを試みる
    3. ステップ3:conflictの内容を確認する
    4. ステップ4:conflictの詳細を確認する
    5. ステップ5:conflictを手動で解決する
    6. ステップ6:解決したファイルをステージングする
    7. ステップ7:マージをコミットする
  4. 実践的なコード例
    1. 例:JavaScriptファイルのconflict解決
    2. 例:JSONファイルのconflict解決
  5. Gitコマンドを使った解決方法
    1. 方法1:一方のバージョンを完全に採用する
    2. 方法2:conflictをリセットしてやり直す
    3. 方法3:マージツールを使う
  6. よくある間違い
    1. 間違い1:conflict マーカーを削除せずにコミットする
    2. 間違い2:どちらの変更が正しいか確認せずに解決する
    3. 間違い3:ファイル全体を誤って削除する
    4. 間違い4:git add を忘れる
    5. 間errors 5:コンテキストを失わずに解決する重要性
  7. conflictを防ぐベストプラクティス
    1. 1. 頻繁にプルする
    2. 2. 小さなコミットに分ける
    3. 3. ブランチ戦略を統一する
    4. 4. コミュニケーションを取る
  8. トラブルシューティング
    1. Q:conflictが解決できない場合はどうするか?
    2. Q:複数ファイルのconflictが発生した場合は?
  9. まとめ

Git merge conflictとは

Git merge conflictは、複数のブランチで同じファイルの同じ部分を異なる方法で編集した場合に発生するエラーです。Gitが自動的にマージできず、どちらの変更を採用するか判断できない状況を指します。

原因の詳しい説明

1. 同じファイルの同じ行を複数人が編集した場合

最も一般的なmerge conflict の原因は、同じファイルの同じ行を異なるブランチで編集するケースです。例えば、AさんがfeatureブランチでコードAを追加し、同時にBさんがdevelopブランチでコードBを追加した場合、マージする際にGitは決定できません。


# develop ブランチ
const name = \"Alice\";

# feature ブランチ
const name = \"Bob\";

2. ファイルの削除と編集の競合

一方のブランチでファイルが削除されたのに対し、もう一方のブランチで同じファイルが編集されている場合もconflictが発生します。

3. 複雑なマージシナリオ

複数のブランチをマージする場合や、既にマージされたブランチを再度マージする場合など、複雑な状況でもconflictが起こります。

Git merge conflictの解決手順

ステップ1:現在のブランチを確認する

まず、どのブランチにいるかを確認します。


git branch

ステップ2:マージを試みる

目的のブランチをマージします。


git merge feature-branch

ステップ3:conflictの内容を確認する

conflictが発生すると、Gitは以下のようなメッセージを表示します。


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

conflictが起きたファイルを確認するには以下を実行します。


git status

ステップ4:conflictの詳細を確認する

テキストエディタでファイルを開くと、以下のような形式でconflictが表示されます。


<<<<<<< HEAD
const greeting = \"Hello, Alice\";
=======
const greeting = \"Hello, Bob\";
>>>>>>> feature-branch

この表記の意味は以下の通りです:

  • <<<<<<< HEAD:現在のブランチ(develop)の内容
  • =======:区切り線
  • >>>>>>> feature-branch:マージしようとしているブランチ(feature-branch)の内容

ステップ5:conflictを手動で解決する

どちらの変更を採用するか、または両方を組み合わせるかを決めて、手動でファイルを編集します。


// 選択肢1:develop の内容を採用
const greeting = \"Hello, Alice\";

// 選択肢2:feature-branch の内容を採用
const greeting = \"Hello, Bob\";

// 選択肢3:両方を組み合わせる
const greetings = [\"Hello, Alice\", \"Hello, Bob\"];

conflictのマーカー(<<<<<<<=======>>>>>>>)もすべて削除します。

ステップ6:解決したファイルをステージングする


git add index.js

ステップ7:マージをコミットする


git commit -m \"Resolve merge conflict in index.js\"

実践的なコード例

例:JavaScriptファイルのconflict解決

初期状態(conflict発生時):


// utils.js
function calculateTotal(items) {
<<<<<<< HEAD
  return items.reduce((sum, item) => sum + item.price, 0);
=======
  let total = 0;
  for (let item of items) {
    total += item.cost;
  }
  return total;
>>>>>>> feature-branch
}

解決後:


// utils.js
function calculateTotal(items) {
  // プロパティ名を統一し、モダンな書き方を採用
  return items.reduce((sum, item) => {
    const amount = item.price || item.cost;
    return sum + amount;
  }, 0);
}

例:JSONファイルのconflict解決

初期状態:


{
  \"version\": \"1.0.0\",
<<<<<<< HEAD
  \"author\": \"Alice\",
=======
  \"author\": \"Bob\",
>>>>>>> feature-branch
  \"license\": \"MIT\"
}

解決後(両方の情報を保持):


{
  \"version\": \"1.0.0\",
  \"authors\": [\"Alice\", \"Bob\"],
  \"license\": \"MIT\"
}

Gitコマンドを使った解決方法

方法1:一方のバージョンを完全に採用する

現在のブランチの内容を採用する場合:


git checkout --ours filename.js

マージ元のブランチの内容を採用する場合:


git checkout --theirs filename.js

方法2:conflictをリセットしてやり直す

マージをキャンセルしたい場合:


git merge --abort

方法3:マージツールを使う

VimやVisual Studio Codeなどのマージツールを使う方法もあります。


git mergetool

よくある間違い

間違い1:conflict マーカーを削除せずにコミットする

❌ 間違った例:


const greeting = \"<<<<<<< HEAD\";
const greeting = \"Hello, Alice\";
const greeting = \"=======\";
const greeting = \"Hello, Bob\";
const greeting = \">>>>>>> feature-branch\";

✅ 正しい例:


const greeting = \"Hello, Alice\";

間違い2:どちらの変更が正しいか確認せずに解決する

conflictを急いで解決しようとして、コードの意味を理解せずにファイルを編集するのは危険です。常に以下を確認しましょう:

  • それぞれの変更の目的
  • プロジェクト全体への影響
  • テストの通過

間違い3:ファイル全体を誤って削除する

conflict解決時に、重要なコードまで削除してしまう事例があります。conflictの対象となっている部分だけを慎重に編集してください。

間違い4:git add を忘れる

conflictを解決しても、git addを実行しなければマージは完了しません。


# ❌ 間違い
git commit -m \"Merge conflict resolved\"

# ✅ 正しい
git add .
git commit -m \"Merge conflict resolved\"

間errors 5:コンテキストを失わずに解決する重要性

他の開発者の変更内容を理解するため、以下のコマンドで詳細を確認できます。


git log --oneline --graph --all
git diff HEAD feature-branch

conflictを防ぐベストプラクティス

1. 頻繁にプルする

定期的に最新のコードをプルすることで、conflictを最小化できます。


git pull origin develop

2. 小さなコミットに分ける

大きな変更よりも、小さく分割したコミットの方がconflictが起きにくいです。

3. ブランチ戦略を統一する

Git Flowなどの戦略を採用することで、conflictの頻度を減らせます。

4. コミュニケーションを取る

チーム内で誰が何を編集しているか共有することで、conflictを事前に防ぐことができます。

トラブルシューティング

Q:conflictが解決できない場合はどうするか?

A:以下の手順を試してください。

  1. git merge --abortでマージをキャンセル
  2. チームメンバーと相談
  3. マージツールを使用
  4. 必要に応じてリベースを検討

Q:複数ファイルのconflictが発生した場合は?

A:git statusで全ファイルを確認し、一つずつ解決していきます。


git status | grep \"both modified\"

まとめ

Git merge conflictは、チーム開発では避けられない現象ですが、正しい手順で対処すれば簡単に解決できます。本記事で学んだポイントは以下の通りです:

  • conflictの原因は同じファイルの同じ部分を異なる方法で編集することにある
  • 解決手順は確認→編集→ステージング→コミットの4ステップ
  • conflict マーカーを完全に削除することが重要
  • 一方の変更を完全に採用するか、両方を組み合わせるかを慎重に判断する
  • conflictを防ぐため、頻繁なプルと小さなコミットが有効
  • チーム内でのコミュニケーションが最も重要

これらの知識を身につけることで、conflictによるストレスなくスムーズな開発が実現できます。最初は複雑に感じるかもしれませんが、実践を通じて習熟していくことが大切です。

タイトルとURLをコピーしました