はじめに
この実験では、Git でのマージコンフリクトを識別し理解する方法を学びます。異なるブランチで同じファイルに矛盾する変更を加え、それらをマージしようとすることで、コンフリクトシナリオをシミュレートします。
git status
コマンドを使用してコンフリクトの有無を検出し、コンフリクトが発生したファイルを調べて、Git が挿入するコンフリクトマーカーを確認します。最後に、コンフリクトのないファイルがそのようにマークされていないことを確認します。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験では、Git でのマージコンフリクトを識別し理解する方法を学びます。異なるブランチで同じファイルに矛盾する変更を加え、それらをマージしようとすることで、コンフリクトシナリオをシミュレートします。
git status
コマンドを使用してコンフリクトの有無を検出し、コンフリクトが発生したファイルを調べて、Git が挿入するコンフリクトマーカーを確認します。最後に、コンフリクトのないファイルがそのようにマークされていないことを確認します。
このステップでは、Git リポジトリ内のコンフリクトを検出するために git status
コマンドを使用する方法を学びます。コンフリクトは、ファイルの同じ部分に 2 つの異なる変更が加えられ、Git がどの変更を保持するかを判断できない場合に発生します。
まず、プロジェクトディレクトリにいることを確認しましょう。ターミナルを開き、my-time-machine
ディレクトリに移動します。
cd ~/project/my-time-machine
では、コンフリクトをシミュレートしましょう。あなたと共同作業者が同時に、ただし異なるブランチで message.txt
ファイルに変更を加えたと想像してください。この実験では、コンフリクトが発生するシナリオを手動で作成します。
まず、新しいブランチを作成して変更を加えましょう。
git branch feature/greeting
git checkout feature/greeting
echo "Hope you are doing well!" >> message.txt
git add message.txt
git commit -m "Add a greeting"
次に、master
ブランチに戻り、同じファイルに異なる変更を加えましょう。
git checkout master
echo "This is an important message." >> message.txt
git add message.txt
git commit -m "Add an important message"
これで、2 つの異なるブランチで message.txt
に 2 つの異なる変更が加えられました。これらのブランチをマージしようとすると、Git はコンフリクトを検出します。
feature/greeting
ブランチを master
ブランチにマージしてみましょう。
git merge feature/greeting
コンフリクトを示す出力が表示されるはずです。
Auto-merging message.txt
CONFLICT (content): Merge conflict in message.txt
Automatic merge failed; fix conflicts and then commit the result.
この出力は、message.txt
ファイルにマージコンフリクトがあることを示しています。変更が重複していたため、Git は自動的にマージできませんでした。
では、git status
を実行して、Git がコンフリクトをどのように報告するかを確認しましょう。
git status
出力は次のようになります。
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to resolve merge conflicts)
both modified: message.txt
no changes added to commit (use "git add" and/or "git commit -a)")
git status
の出力は、「On branch master」であり、「unmerged paths」があることを明確に示しています。また、「Unmerged paths」の下に message.txt
がリストされ、「both modified」であることが示されています。これが、git status
がマージコンフリクトのあるファイルを識別する方法です。
git status
を使用してコンフリクトを検出する方法を理解することは、コンフリクトを解決する最初のステップです。次のステップでは、コンフリクトが発生したファイルを調べ、コンフリクトを解決する方法を学びます。
前のステップで、git status
が message.txt
でコンフリクトを報告していることを確認しました。では、Git がコンフリクト部分をどのようにマークしているかを確認するために、ファイル自体を調べてみましょう。
まだ ~/project/my-time-machine
ディレクトリにいることを確認してください。
cat
コマンドを使用してファイルの内容を表示できます。
cat message.txt
出力は次のようになります。
Hello, Future Me
<<<<<<< HEAD
This is an important message.
=======
Hope you are doing well!
>>>>>>> feature/greeting
Git がファイルに追加した特殊なマーカーに注目してください。
<<<<<<< HEAD
: これは、現在のブランチ(この場合は HEAD
が指す master
ブランチ)の変更の開始を示します。=======
: これは、2 つのブランチからの変更の区切りです。>>>>>>> feature/greeting
: これは、マージ元のブランチ(feature/greeting
)からの変更の終了を示します。これらのマーカーにより、コンフリクトが発生した場所と、コンフリクトする行の異なるバージョンが正確にわかります。<<<<<<< HEAD
と =======
の間の行は、現在のブランチ(master
)からの変更であり、=======
と >>>>>>> feature/greeting
の間の行は、マージしているブランチ(feature/greeting
)からの変更です。
あなたのタスクは、このファイルを手動で編集し、どの変更を残すかを決めることです。コンフリクトマーカーと残したくない行を削除し、最終的に必要な内容のみを残す必要があります。
たとえば、両方のメッセージを残したい場合は、ファイルを次のように編集します。
Hello, Future Me
This is an important message.
Hope you are doing well!
または、master
ブランチからのメッセージのみを残したい場合は、ファイルを次のように編集します。
Hello, Future Me
This is an important message.
nano
エディタを使用して message.txt
ファイルを開き、編集します。
nano message.txt
コンフリクトマーカーを削除し、残したい内容を選択することで、コンフリクトを解決するためにファイルを編集します。この実験では、両方のメッセージを残しましょう。
編集後、ファイルの内容は次のようになるはずです。
Hello, Future Me
This is an important message.
Hope you are doing well!
Ctrl + X
を押して nano
を終了し、Y
を押して変更を保存し、最後に Enter
を押してファイル名を確認します。
ファイルを手動で編集し、コンフリクトマーカーを削除することで、Git にコンフリクトする変更をどのように結合するかを指示しています。これは、マージコンフリクトを解決する上で重要なステップです。
前のステップでは、マージコンフリクトのあるファイル (message.txt
) を特定し、調べました。ただし、マージ中には、両方のブランチで変更されたがコンフリクトのないファイルもあるかもしれません。Git はこれらのファイルを自動的にマージします。
このステップでは、一方のブランチに新しいファイルを作成し、マージプロセス中に Git がどのように扱うかを確認します。これにより、コンフリクトは同じファイル内で変更が重複する場合にのみ発生することを理解できます。
まだ ~/project/my-time-machine
ディレクトリにいて、master
ブランチ(マージコンフリクトが発生したブランチ)にいることを確認してください。
master
ブランチに notes.txt
という新しいファイルを作成しましょう。
echo "Important notes for the project." > notes.txt
git add notes.txt
git commit -m "Add project notes"
次に、feature/greeting
ブランチに戻りましょう。
git checkout feature/greeting
このブランチでは、notes.txt
ファイルはまだ存在しません。ここで別のファイル、たとえば todo.txt
を作成しましょう。
echo "Things to do: finish the lab." > todo.txt
git add todo.txt
git commit -m "Add a todo list"
次に、master
ブランチに戻り、再度マージを試みましょう。message.txt
のコンフリクトはすでに解決していますが、マージプロセスを完了する必要があります。
git checkout master
git merge feature/greeting
今回は、message.txt
のコンフリクトをすでに解決し、それをステージングエリアに追加しているため(編集後のそのステップを明示的に示していませんが、手動でコンフリクトを解決した後、Git はしばしばファイルをステージングエリアに追加します)、Git はマージを完了できるはずです。マージが完了したことを示す出力が表示されるかもしれません。
再度ステータスを確認しましょう。
git status
出力は、「On branch master」であり、作業ツリーがクリーンであることを示すはずです。つまり、保留中の変更や未マージのパスはありません。
On branch master
nothing to commit, working tree clean
次に、両方のブランチのファイルが master
ブランチに存在するかを確認しましょう。
ls
message.txt
、notes.txt
(master
ブランチから)、todo.txt
(feature/greeting
ブランチから)がリストされているはずです。
message.txt notes.txt todo.txt
これは、todo.txt
が master
ブランチに存在しなかったため、Git が feature/greeting
からの変更(新しい todo.txt
ファイルを含む)をコンフリクトなしで正常にマージしたことを示しています。コンフリクトは、マージするブランチで同じファイルに重複する変更がある場合にのみ発生します。
マージ中に Git がコンフリクトのあるファイルとコンフリクトのないファイルをどのように扱うかを理解することは、プロジェクトの履歴を効果的に管理するために不可欠です。
この実験では、git status
コマンドを使用して Git でコンフリクトを検出する方法を学びました。別々のブランチで同じファイルに異なる変更を加え、それらをマージしようとすることでコンフリクトをシミュレートしました。git status
の出力は、未マージのパスの存在とコンフリクトのある特定のファイルを明確に示しました。
また、コンフリクトのあるファイル内でコンフリクトマーカーを識別する方法を調べました。これらのマーカーは、Git がコンフリクト部分を強調するために挿入するものです。最後に、コンフリクトのないファイルにはこれらの特殊文字が付けられていないことを確認し、Git がマージ問題をどのようにフラグ付けするかについての理解を深めました。