【Git】コンフリクトについて

Gitのコンフリクトは、複数の人が同じファイルの同じ部分を異なる方法で編集し、その変更を同時にマージしようとしたときに発生します。これを解決するには、編集の衝突を手動で確認し、どの変更を保持するかを決める必要があります。基本的なステップは以下の通りです:

ステップ例

  1. コンフリクトが発生したことを確認する: Gitがマージ中にコンフリクトを検出すると、その旨を告げるメッセージが表示されます。
  2. コンフリクトのあるファイルを確認するgit statusコマンドを使用して、コンフリクトがあるファイルを確認します。これらのファイルは「コンフリクト状態」になっています。
  3. ファイルを開いてコンフリクトを解決する: コンフリクトのあるファイルをテキストエディタで開きます。Gitはコンフリクトのある部分を特殊なマーカー(<<<<<<<=======>>>>>>>)で囲みます。これらのマーカーの間には、異なるブランチの変更が含まれています。これらを参照して、どの変更を保持するかを手動で選択し、マーカーを削除します。
  4. コンフリクトの解決後のファイルをステージングする: コンフリクトを解決したら、git add <ファイル名>コマンドを使用して変更をステージングします。
  5. マージを完了する: すべてのコンフリクトを解決し、変更をステージングしたら、git commitコマンドを使用してマージコミットを完了します。Gitは自動的に適切なコミットメッセージを提案しますが、必要に応じて編集できます。
  6. (オプション)マージの変更をプッシュする: ローカルリポジトリでのマージ作業が完了したら、変更をリモートリポジトリにプッシュすることができます。

コンフリクトの解決は時に複雑になることがありますが、コードの整合性を保ちながら複数人での作業を可能にするために重要なプロセスです。

サンプル

Git コンフリクトを解決するプロセスをより理解しやすくするために、簡単なサンプルを通じて説明します。想定するシナリオは、2人の開発者が同じリポジトリの同じファイルに異なる変更を加え、それをマージしようとした場合です。

ステップ 1: コンフリクトの発生

2人の開発者が同じファイル example.txt に異なる変更を加えました。開発者Aは行を追加し、開発者Bも別の行を追加しました。

開発者Aの変更:

これはサンプルテキストです。
開発者Aによる追加行。

開発者Bの変更:

これはサンプルテキストです。
開発者Bによる追加行。

開発者Aが先に変更をリモートリポジトリにプッシュしました。開発者Bが自分の変更をプッシュしようとすると、Gitはコンフリクトが発生したことを警告します。

ステップ 2: コンフリクトの検出

開発者Bは、ローカルで git pull (または git merge) を実行した後、以下のようなメッセージでコンフリクトが発生していることを知らされます。

自動マージ example.txt
コンフリクト(コンテンツ):example.txt
自動マージに失敗しました。修正してコミットしてください。

ステップ 3: コンフリクトの解決

開発者Bは example.txt を開き、以下のようなマーカーで囲まれたコンフリクトを見つけます。

これはサンプルテキストです。
<<<<<<< HEAD
開発者Bによる追加行。
=======
開発者Aによる追加行。
>>>>>>> branch-a

開発者Bは、どちらの行も重要だと判断し、以下のように両方の変更を統合することに決めます。

これはサンプルテキストです。
開発者Bによる追加行。
開発者Aによる追加行。

ステップ 4: コンフリクトの解決後のファイルをステージング

開発者Bは修正を加えた後、以下のコマンドを使用して変更をステージングします。

git add example.txt

ステップ 5: マージを完了

変更をステージングしたら、git commit を実行してコンフリクトの解決を記録します。Gitはコミットメッセージのエディタを開き、マージコミットのメッセージを提案します。

ステップ 6: マージの変更をプッシュ

最後に、以下のコマンドを使用してリモートリポジトリに変更をプッシュします。

git push origin main

このサンプルを通じて、Git コンフリクトの基本的な解決プロセスを理解することができます。