コマンド ラインを使用してマージ コンフリクトを解決する
コマンド ラインとテキスト エディターを使用することで、マージ コンフリクトを解決できます。
マージコンフリクトは、競合している変更がファイルの同じ行に行われるとき、またはある人があるファイルを編集し別の人が同じファイルを削除すると発生します。 詳細は「マージコンフリクトについて」を参照してください。
参考: GitHub Enterprise でコンフリクト エディターを使用することで、Pull Request の一部であるブランチの間で競合している行変更のマージ コンフリクトを解消できます。 詳細については、「GitHub でマージコンフリクトを解決する」を参照してください。
競合している行変更のマージ コンフリクト
競合している行変更により発生するマージ コンフリクトを解決するには、新しいコミットにどの変更を組み込むかをいくつかの別のブランチから選択する必要があります。
たとえば、あなたともう一人が両方とも、同じ Git リポジトリの別のブランチにあるファイル styleguide.md で同じ行を編集した場合、これらのブランチをマージしようとするとマージ コンフリクト エラーが発生します。 これらのブランチをマージする前に、新たなコミットでこのマージ コンフリクトを解決する必要があります。
-
ターミナルターミナルGit Bashターミナル を開いてください。
-
マージ コンフリクトが発生しているローカルの Git リポジトリに移動します。
cd REPOSITORY-NAME
-
マージ コンフリクトの影響を受けるファイルのリストを生成します。 この例では、ファイル *styleguide.md
です。
4. Atom などのお気に入りのテキスト エディターを開き、マージ コンフリクトが発生しているファイルに移動します。
5. ファイル内でマージ コンフリクトの始まりを確認するには、ファイル内のコンフリクト マーカー <<<<<<<
を検索します。 テキスト エディターでファイルを開くと、行の後に HEAD またはベース ブランチからの変更である <<<<<<< HEAD
が目につきます。 次に、=======
が見えます。これは、自分の変更と他のブランチでの変更を区別するものであり、その後に >>>>>>> BRANCH-NAME
が続きます。 この例では、ある人が HEAD (ベース) ブランチに "open an issue" と書き込み、別の人が compare ブランチ (branch-a
) に "ask your question in IRC" と書き込みました。
If you have questions, please <<<<<<< HEAD
# open an issue
ask your question in IRC.
> > > > > > > branch-a ```` 1. 自分のブランチの変更だけを保持するか、他のブランチの変更だけを保持するか、あるいは両方の変更を含む新しい変更を作成するかを決定してください。コンフリクトマーカーの `<<<<<<<`、`=======`、`>>>>>>>` を削除し、最終のマージに含めたい変更を作成してください。
この例では、両方の変更が最終的なマージに取り込まれています:
<pre><code class="hljs language-shell">If you have questions, please open an issue or ask in our IRC channel if it's more urgent.</code></pre>
7. 変更を追加またはステージングします。
<pre><code class="hljs language-shell">$ git add .</code></pre>
8. 変更をコメントを付けてコミットします。
<pre><code class="hljs language-shell">$ git commit -m "Resolved merge conflict by incorporating both suggestions."</code></pre>
これでコマンド ラインでブランチをマージできます。 また、GitHub Enterprise で[変更をリモート リポジトリにプッシュする](/articles/pushing-to-a-remote/)ことや、Pull Request で[変更をマージする](/articles/merging-a-pull-request/)ことができます。
### 削除したファイルのマージコンフリクト
ある人があるブランチでファイルを削除し、別の人が同じファイルを編集するなどの、ファイルへの変更が競合していることにより発生するマージ コンフリクトを解決するには、削除したファイルを削除するか保持するかを新しいコミットで選択する必要があります。
たとえば、あなたが *README.md* などのファイルを編集した場合、別の人が同じ Git リポジトリ内の別のブランチにある同じファイルを削除したならば、これらのブランチをマージしようとすると、マージ コンフリクト エラーが発生します。 これらのブランチをマージする前に、新たなコミットでこのマージ コンフリクトを解決する必要があります。
1. <span class="platform-mac">ターミナル</span><span class="platform-linux">ターミナル</span><span class="platform-windows">Git Bash</span><span class="platform-all">ターミナル</span> を開いてください。
2. マージ コンフリクトが発生しているローカルの Git リポジトリに移動します。
<pre><code class="hljs language-shell">cd <em>REPOSITORY-NAME</em></code></pre>
2. マージ コンフリクトの影響を受けるファイルのリストを生成します。 この例では、ファイル *README.md* にマージコンフリクトが発生しています。
shell
$ git status
> # On branch master
> # Your branch and 'origin/master' 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")
3. [Atom](https://atom.io/) などのお気に入りのテキスト エディターを開き、マージ コンフリクトが発生しているファイルに移動します。
4. 削除したファイルを保存するかどうかを決めます。 削除したファイルに行った最新の変更をテキスト エディターで確認することをお勧めします。
削除したファイルをリポジトリに追加して戻すには:
<pre><code class="hljs language-shell">$ git add README.md</code></pre>
このファイルをリポジトリから削除するには:
<pre><code class="hljs language-shell">$ git rm README.md
> README.md: needs merge
> rm 'README.md'</code></pre>
7. 変更をコメントを付けてコミットします。
<pre><code class="hljs language-shell">$ git commit -m "Resolved merge conflict by keeping README.md file."
> [branch-d 6f89e49] Merge branch 'branch-c' into branch-d</code></pre>
これでコマンド ラインでブランチをマージできます。 または、GitHub Enterprise で[変更をリモート リポジトリにプッシュする](/articles/pushing-to-a-remote/)ことや、Pull Request で[変更をマージする](/articles/merging-a-pull-request/)ことができます。
### 参考リンク
- "[マージコンフリクトについて](/articles/about-merge-conflicts)"
- "[Pull Request をローカルでチェック アウトする](/articles/checking-out-pull-requests-locally/)"