Git でファイルにコンフリクトがあるかどうかを確認する方法

GitGitBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Git でのマージコンフリクトを識別し理解する方法を学びます。異なるブランチで同じファイルに矛盾する変更を加え、それらをマージしようとすることで、コンフリクトシナリオをシミュレートします。

git status コマンドを使用してコンフリクトの有無を検出し、コンフリクトが発生したファイルを調べて、Git が挿入するコンフリクトマーカーを確認します。最後に、コンフリクトのないファイルがそのようにマークされていないことを確認します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git/BasicOperationsGroup -.-> git/add("Stage Files") git/BasicOperationsGroup -.-> git/status("Check Status") git/BasicOperationsGroup -.-> git/commit("Create Commit") git/BranchManagementGroup -.-> git/branch("Handle Branches") git/BranchManagementGroup -.-> git/checkout("Switch Branches") git/BranchManagementGroup -.-> git/merge("Merge Histories") subgraph Lab Skills git/add -.-> lab-560023{{"Git でファイルにコンフリクトがあるかどうかを確認する方法"}} git/status -.-> lab-560023{{"Git でファイルにコンフリクトがあるかどうかを確認する方法"}} git/commit -.-> lab-560023{{"Git でファイルにコンフリクトがあるかどうかを確認する方法"}} git/branch -.-> lab-560023{{"Git でファイルにコンフリクトがあるかどうかを確認する方法"}} git/checkout -.-> lab-560023{{"Git でファイルにコンフリクトがあるかどうかを確認する方法"}} git/merge -.-> lab-560023{{"Git でファイルにコンフリクトがあるかどうかを確認する方法"}} end

git status を実行してコンフリクトを検出する

このステップでは、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 statusmessage.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.txtnotes.txtmaster ブランチから)、todo.txtfeature/greeting ブランチから)がリストされているはずです。

message.txt  notes.txt  todo.txt

これは、todo.txtmaster ブランチに存在しなかったため、Git が feature/greeting からの変更(新しい todo.txt ファイルを含む)をコンフリクトなしで正常にマージしたことを示しています。コンフリクトは、マージするブランチで同じファイルに重複する変更がある場合にのみ発生します。

マージ中に Git がコンフリクトのあるファイルとコンフリクトのないファイルをどのように扱うかを理解することは、プロジェクトの履歴を効果的に管理するために不可欠です。

まとめ

この実験では、git status コマンドを使用して Git でコンフリクトを検出する方法を学びました。別々のブランチで同じファイルに異なる変更を加え、それらをマージしようとすることでコンフリクトをシミュレートしました。git status の出力は、未マージのパスの存在とコンフリクトのある特定のファイルを明確に示しました。

また、コンフリクトのあるファイル内でコンフリクトマーカーを識別する方法を調べました。これらのマーカーは、Git がコンフリクト部分を強調するために挿入するものです。最後に、コンフリクトのないファイルにはこれらの特殊文字が付けられていないことを確認し、Git がマージ問題をどのようにフラグ付けするかについての理解を深めました。