Skip to main content

コマンド ラインを使用してマージ コンフリクトを解決する

コマンド ラインとテキスト エディターを使用することで、マージ コンフリクトを解決できます。

Platform navigation

マージコンフリクトは、競合している変更がファイルの同じ行に行われるとき、またはある人があるファイルを編集し別の人が同じファイルを削除すると発生します。 詳しくは、「マージ競合について」を参照してください。

ヒント: GitHub のコンフリクト エディターを使用することで、pull request の一部であるブランチの間で競合している行変更のマージ競合を解決できます。 詳しくは、「GitHub でのマージ コンフリクトを解決する」を参照してください。

競合している行変更のマージ コンフリクト

競合している行変更により発生するマージ コンフリクトを解決するには、新しいコミットにどの変更を組み込むかをいくつかの別のブランチから選択する必要があります。

たとえば、自分と別のユーザーの両方が、同じ Git リポジトリの別のブランチにあるファイル styleguide.md で同じ行を編集した場合、これらのブランチをマージしようとするとマージ競合エラーが発生します。 これらのブランチをマージする前に、新たなコミットでこのマージコンフリクトを解決する必要があります。

  1. [ターミナル][ターミナル][Git Bash] を開きます。

  2. マージ コンフリクトが発生しているローカルの Git リポジトリに移動します。

    cd REPOSITORY-NAME
    
  3. マージ コンフリクトの影響を受けるファイルのリストを生成します。 この例では、ファイル styleguide.md にマージ競合が発生しています。

    $ git status
    > # On branch branch-b
    > # You have unmerged paths.
    > #   (fix conflicts and run "git commit")
    > #
    > # Unmerged paths:
    > #   (use "git add <file>..." to mark resolution)
    > #
    > # both modified:      styleguide.md
    > #
    > no changes added to commit (use "git add" and/or "git commit -a")
    
  4. Visual Studio Code など、好みのテキスト エディターを開き、マージ競合が発生しているファイルに移動します。

  5. ファイル内でマージ競合の先頭を確認するには、ファイルで競合マーカー <<<<<<< を検索します。 テキスト エディターでファイルを開くと、行 <<<<<<< HEAD の後に HEAD つまりベース ブランチからの変更があることがわかります。 次に、======= があります。これは、自分の変更と他のブランチでの変更を区別するものであり、その後に >>>>>>> BRANCH-NAME が続きます。 この例では、あるユーザーがベース (HEAD) ブランチに "open an issue" と書き込み、別のユーザーが比較ブランチ (branch-a) に "ask your question in IRC" と書き込みました。

    If you have questions, please
    <<<<<<< HEAD
    open an issue
    =======
    ask your question in IRC.
    >>>>>>> branch-a
    
  6. あなたのブランチの変更だけを保持したいか、他のブランチの変更だけを保持したいか、あるいは両方のブランチからの変更を取り入れられる新しい変更を作成するかを決めてください。 競合マーカー <<<<<<<=======>>>>>>> を削除し、最終的なマージで必要な変更を行います。この例では、両方の変更が最終的なマージに取り込まれます。

    If you have questions, please open an issue or ask in our IRC channel if it's more urgent.
    
  7. 変更を追加またはステージングします。

    git add .
    
  8. 変更をコメントを付けてコミットします。

    git commit -m "Resolve merge conflict by incorporating both suggestions"
    

これで、コマンド ラインでブランチをマージできます。または、GitHub で変更をリモート リポジトリにプッシュし、pull request で変更をマージすることができます。

削除したファイルのマージコンフリクト

ある人があるブランチでファイルを削除し、別の人が同じファイルを編集するなどの、ファイルへの変更が競合していることにより発生するマージコンフリクトを解決するには、削除したファイルを削除するか保持するかを新しいコミットで選択する必要があります。

たとえば、自分が README.md などのファイルを編集し、別のユーザーが同じ Git リポジトリ内の別のブランチにある同じファイルを削除した場合、これらのブランチをマージしようとするとマージ競合エラーが発生します。 これらのブランチをマージする前に、新たなコミットでこのマージコンフリクトを解決する必要があります。

  1. [ターミナル][ターミナル][Git Bash] を開きます。

  2. マージ コンフリクトが発生しているローカルの Git リポジトリに移動します。

    cd REPOSITORY-NAME
    
  3. マージ コンフリクトの影響を受けるファイルのリストを生成します。 この例では、ファイル README.md にマージ競合が発生しています。

    $ git status
    > # On branch main
    > # Your branch and 'origin/main' have diverged,
    > # and have 1 and 2 different commits each, respectively.
    > #  (use "git pull" to merge the remote branch into yours)
    > # You have unmerged paths.
    > #  (fix conflicts and run "git commit")
    > #
    > # Unmerged paths:
    > #  (use "git add/rm <file>..." as appropriate to mark resolution)
    > #
    > #  deleted by us:   README.md
    > #
    > # no changes added to commit (use "git add" and/or "git commit -a")
    
  4. Visual Studio Code など、好みのテキスト エディターを開き、マージ競合が発生しているファイルに移動します。

  5. 削除したファイルを保存するかどうかを決めます。 削除したファイルに行った最新の変更をテキスト エディターで確認することをお勧めします。

    削除したファイルをリポジトリに追加して戻すには:

    git add README.md
    

    このファイルをリポジトリから削除するには:

    $ git rm README.md
    > README.md: needs merge
    > rm 'README.md'
    
  6. 変更をコメントを付けてコミットします。

    $ git commit -m "Resolve merge conflict by keeping README.md file"
    > [branch-d 6f89e49] Merge branch 'branch-c' into branch-d
    

これで、コマンド ラインでブランチをマージできます。または、GitHub で変更をリモート リポジトリにプッシュし、pull request で変更をマージすることができます。

参考資料