Git ガイド
コマンドラインおよび 3 者間エディターで Git マージの競合を解決する方法
Git でマージ競合を解決する方法: 競合マーカーを読み取り、単純な Git コマンドまたはビジュアル 3 方向エディターで修正し、マージ前に競合が発生することを確認します。さらに、安全に中止してマージを取り消します。

Git でマージ競合を解決するには、Git が競合していると報告した各ファイルを開き、<<<<<<<、=======、>>>>>>> マーカーの間にコードを含める必要があるかを決定し、マーカーを削除し、git add でファイルをステージングし、git commit (または git merge --continue) で終了します。取り消すには、git merge --abort を実行してください。このガイドでは、コマンド ラインでそのループを説明し、次にビジュアル 3 方向エディターで説明し、最後に競合を稀にし、簡単に元に戻す習慣を説明します。一時停止したマージ、リベース、またはチェリーピックによって得られる選択肢を練習するには、無料レッスン アクティブな操作を続行、スキップ、または中止する を受講してください。
視覚的な例では、macOS、Windows、および Linux 用に作成した Git クライアントである GitTree を使用します。コンピュータにインストールされている Git が実行されるため、クリックしても入力しても同じ結果が得られます。 GitTree 機能リスト には、より広い概要が記載されています。
Git におけるマージ競合とは実際には何ですか
Git は、各ファイルの 3 つのバージョンを使用して 1 行ずつマージします。base (両方のブランチが共有する最後のコミット)、ours (現在のブランチ、HEAD)、theirs (受信ブランチ、MERGE_HEAD) です。一方の側だけがリージョンを変更した場合、Git はその変更を受け入れます。双方が同じ行を異なる方法で変更した場合、Git は停止し、両方のバージョンをファイルに書き込み、決定をユーザーに任せます。
同じことが git pull、git rebase、git cherry-pick、git revert、および git stash pop でも発生する可能性があります。修正内容は同じです。最後のコマンドのみが異なります。 git status は、競合する各パスにラベルを付けます。
- 両方変更: 両方のブランチが同じ行を変更しました。これはよくあるケースです。
- 私たちによって削除されました / 彼らによって削除されました: 一方がファイルを削除し、もう一方がファイルを変更したため、変更されたファイルを保持するか、削除を確認します。
- 両方追加: 各ブランチは同じパスに異なるファイルを作成しました。
コマンドラインでマージ競合を修正する方法
1. 競合するファイルを見つける
Git はマージが停止した瞬間に競合をリストし、完了するまで git status がリストを保持します。 git diff --name-only --diff-filter=U は、マージされていないパスのみを出力します。
$ git merge feature/login
Auto-merging src/auth.ts
CONFLICT (content): Merge conflict in src/auth.ts
Automatic merge failed; fix conflicts and then commit the result.
$ git status
On branch main
You have unmerged paths.
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: src/auth.ts2. 競合マーカーを読み取る
マーカーの外側のすべてがきれいにマージされました。 <<<<<<< HEAD の後のブロックは現在のブランチ、>>>>>>> feature/login の前のブロックは受信ブランチで、それらは ======= 行で区切られています。
export const retries = 3;
<<<<<<< HEAD
export const timeout = 45;
=======
export const timeout = 60;
>>>>>>> feature/login
export const debug = false;多くの場合、2 つのバージョンだけでは決定するのに十分ではありません。 Git の zdiff3 競合スタイルを一度設定すると、すべての競合で ||||||| 行の後にベースが表示されます。
$ git config --global merge.conflictStyle zdiff3
<<<<<<< HEAD
export const timeout = 45;
||||||| 556e564
export const timeout = 30;
=======
export const timeout = 60;
>>>>>>> feature/loginこれで、メインがタイムアウトを 30 から 45 に引き上げ、機能ブランチが 60 に引き上げられたことがわかります。どのブランチが勝つかではなく、製品に必要な値を決定します。
3. ファイルを編集し、解決済みとしてマークします。
必要なコード (片面、もう片面、ミックスまたは新しいもの) を記述し、すべてのマーカー ラインを削除します。誤ってコミットされた野良 ======= は古典的な壊れたビルドであるため、ステージングする前に Git で残り物をチェックします。
$ git diff --check # lists any leftover conflict markers
$ git add src/auth.ts
$ git commit # or: git merge --continueファイル全体の一方のバージョンが正しい場合は、それを直接取得してください。 Git がマージ中に競合するすべてのハンクに対して一方の側を優先させるには、代わりに git merge -X ours または git merge -X theirs を使用してマージを開始します。競合しない変更は依然として両方のブランチから行われます。
$ git checkout --ours -- src/auth.ts # keep the current branch's version
$ git checkout --theirs -- src/auth.ts # keep the incoming version
$ git add src/auth.ts4. 操作を終了します
すべてのファイルがステージングされたら、停止したものはすべて続行します: git commit (または git merge --continue)、git rebase --continue、git cherry-pick --continue、または git revert --continue。リベースは、後のコミットで再び停止する可能性があります。ループを繰り返します。
| 指示 | それが示すもの |
|---|---|
git diff | 競合した各ファイルの両側に対する結合された差分 |
git log --merge -p <path> | ファイルにアクセスした各側のコミットとその差分 |
git show :1:<path> | ファイルの基本バージョン |
git show :2:<path>、git show :3:<path> | 現在のバージョン (HEAD) と今後のバージョン (MERGE_HEAD) |
git mergetool | Git で構成されたマージ ツールを、競合するファイルを一度に 1 つずつ開きます |

GUI でマージ競合を解決する: 3 方向の Git 競合リゾルバー
マーカーは 2 ラインの衝突には適しています。長いファイル内に多数の競合がある場合、GUI 競合リゾルバーの方が高速で、間違いが起こりにくくなります。優れた Git マージ競合ツールは、3 つのバージョンをすべてまとめて表示し、競合を競合ごとに判断でき、マーカーが残っている間は保存を拒否します。
GitTree では、マージが停止すると、競合の数と競合したファイルのリストを示すバナーが表示されます。 1 つを開くと、エディターがウィンドウ全体を表示します。上部には現在のブランチと受信ブランチが並べて表示され、それぞれにブランチ名のラベルが付けられ、その下に保存されるファイルである 出力 が表示されます。
- 競合ごと: 現在の側、着信側、両方を取るか、どちらも取らないか、それぞれから 1 行を選択します。
- 出力を編集 ボタンでカバーできない部分については手動で行ってください。
- Show Base を使用して共通の祖先を確認します (
merge.conflictStyleがdiff3またはzdiff3の場合、Git はそれを書き込みます)。 - 選択を元に戻す。決定を元に戻すことができます。
- 削除されたファイル: 一方がファイルを削除し、もう一方がファイルを変更した場合、その側のファイルを保持するか、削除を確認します。
GitTree では、マーカー ラインがまだ含まれている結果は保存されません。外部マージ ツール: VS Code、Cursor、JetBrains IDE、Beyond Compare、Meld、KDiff3、P4Merge、WinMerge、カスタム プログラム、または Git 独自の merge.tool でファイルを開くこともできます。ファイルを解決せずにツールを閉じると、ファイルは競合したままになります。
GitTree でのマージ競合を解決する方法 (ステップバイステップ)
マージを開始します
取り込みたいブランチのブランチ メニューを開いて現在のブランチにマージするか、1 つのブランチを別のブランチにドラッグします。メニューには両方のブランチの名前が付けられているため、方向が推測されることはありません。
競合プレビューを読む
何かが変更される前に、マージ ダイアログには、ブランチが競合せずにマージされるか、マージが停止するファイルのリストが表示されます。マージを記録する方法を選択し、確認します。
競合したファイルを開く
マージが停止すると、バナーで競合がカウントされ、ファイル リストに競合した各ファイルが表示されます。 3 方向エディタで最初のエディタを開きます。
それぞれの対立を決定する
現在の側、受信側、両方を選択するか、どちらも選択しないか、単一の行を選択するか、出力を編集します。いずれかのブランチが変更する前のコードを表示するには、Show Base を使用します。
ファイルを保存して解決済みとしてマークします
[保存] を選択し、[解決済み] としてマークします。 GitTree がファイルを書き込んでステージングした後、次のファイルに進みます。競合マーカーラインが残っている間は拒否されます。
マージをコミットする
すべてのファイルが解決されたら、[コミットしてマージ] (リベースの場合はリベースを続行) を選択します。後で気が変わりましたか?コミット メニューからブランチをマージ前のコミットにリセットします。 GitTree は最初にリセットのスナップショットを作成するため、[元に戻す] でリセットを元に戻すことができます。

マージ前にマージ競合を予測する
Git 2.38 以降、git merge-tree --write-tree は、作業ツリーやインデックスの読み書きやコミットを行わずに、メモリ内でマージを実行します。 --name-only を使用すると、競合する可能性のあるファイルがリストされます。終了ステータスは、競合がある場合は 1 で、マージが正常な場合は 0 です。
$ git fetch
$ git merge-tree --write-tree --name-only HEAD origin/main
0d708adc4a836d088802870278cb1f3daf06355f
src/auth.ts
Auto-merging src/auth.ts
CONFLICT (content): Merge conflict in src/auth.tsGitTree はこのプレビューを実行します。マージ ダイアログには、確認する前に予測された結果が表示されます。各フェッチの後、ブランチをそのアップストリームおよびベース ブランチ (別の設定がない限りメインまたはマスター) と照合し、ブランチ名の横に「2 つのファイルでメインと競合します」などの警告が表示されます。 2 番目のヒントは、変更中のファイルをマークし、フェッチされてマージされていない他のブランチも変更されることを示します。
どちらのチェックでも、すでにフェッチしたもののみが使用されます。計算のためにフェッチ、マージ、または変更されるものは何もなく、コンピューターから何も残されません。どちらも環境設定でオフにできます。
git rerere を使用して競合解決を再利用する
レレレとは「Reuse Recorded Resolution」の略称です。これを有効にすると、Git は各競合とその解決方法を記録します。長期間存続するブランチのリベースを繰り返したり、マージをやり直したりした場合など、同じ競合が再発した場合、Git は以前の解決策をファイルに書き込みます。
$ git config --global rerere.enabled true
$ git rerere forget src/auth.ts # drop a recorded resolution that was wrongrerere.autoUpdate が設定されていない限り、Git は再利用された結果をレビューのためにステージングせずに残します。 GitTree のリポジトリ設定には、これらの Git オプションの 記録された解像度の再利用 (rerere) および 再利用された解像度のステージング スイッチがあります。競合ビューでは再利用された解決策にラベルが付けられ、解決策を忘れる により間違った解決策が削除されます。
Git でマージを中止またはキャンセルする方法
競合により停止したマージをキャンセルするには、git merge --abort を実行します。リベース、チェリーピック、またはリバートには独自の中止があります。
$ git merge --abort
$ git rebase --abort
$ git cherry-pick --abort
$ git revert --abortGit 自体のドキュメントでは、マージ開始時にコミットされていない変更を git merge --abort が常に再構築できるわけではないと警告しています。マージする前にコミットまたはスタッシュし、中止では復元するコミットされた作業のみが行われます。
GitTree では、Abort Merge (または Abort Rebase、Cherry-Pick、Revert) で、Git が操作前のブランチ、インデックス、作業コピーを復元し、それまでに行われた解決策が破棄されることを最初に説明します。 GitTree は、ステージングされているかどうかにかかわらず、中断によってドロップされたすべてのものを回復スナップショットに保存するため、「元に戻す」で元に戻すことができます。
マージをコミットした後に元に戻す方法
何をすべきかは、マージをプッシュしたかどうかによって異なります。
# Not pushed yet, right after the merge:
$ git reset --hard ORIG_HEAD # also discards uncommitted changes
$ git reset --merge ORIG_HEAD # keeps uncommitted changes
# Already pushed:
$ git revert -m 1 <merge-commit> # a new commit that reverses itマージではブランチの以前のヒントが ORIG_HEAD に保存されるため、後でリセットまたはリベースで ORIG_HEAD が移動されない限り、それにリセットするとマージが削除されます。他の人がマージを行ったら、代わりに元に戻します。マージを元に戻すと、それらの変更は不要であることが Git に伝えられます。そのブランチを再度マージしても、元に戻さない限り変更は元に戻りません。
GitTree では、グラフ内のマージの最初の親 (ブランチが以前に存在していたコミット) を選択し、コミット メニューからその親に対するソフト、混合、またはハード リセットを選択します。それぞれに保持される内容のラベルが付いています。 GitTree は実行前に 19 種類の操作のスナップショットを作成します。これにはリセットも含まれます。そのため、[元に戻す] でリセットを元に戻すことができ、reflog ビューは古い状態を復元します。 リセット、リベース、またはコミットを元に戻すガイド では、リカバリについて詳しく説明しています。
ほとんどのマージ競合を防ぐ方法
- 分岐は小さく、存続期間を短くしてください。 2 つの分岐が長くなるほど、両方が接触する線が多くなります。
- ベース ブランチを最後に一度だけではなく、頻繁に取り込みます。
- フォーマットをロジックから分離します。 1 つのフォーマッタに同意し、ファイル全体の再フォーマットを独自に実行します。
- 手動でロックファイルをマージするのではなく、ロックファイルを再生成します。 どちらかの側を選択して、パッケージ マネージャーを再度実行します。
- zdiff3 をオンにして、一度再実行します。 2 つのコマンドで永続的なメリットが得られます。
- 統合する前にコミットまたはスタッシュすると、すべての中止と取り消しが正確になります。
まずは安全なリポジトリで練習してみませんか? Git チュートリアル の無料レッスン 分岐したブランチをマージし、両方の親を確認する では、実際のマージについて説明します。まだ端末と GUI を比較検討していますか? Git GUI vs コマンド ライン では、両方を正直に比較しています。
GitTree には、プライベート リポジトリを含むすべての Git 機能をカバーする無料プランがあり、AI アシスタントの Nour には GitTree Pro が付属しています (価格 を参照)。サインインするには、Git 2.39 以降と GitTree アカウントが必要です。macOS、Windows、または Linux 用に入手するか、GitTree ダウンロード ページ ですべてのインストーラーを参照してください。 Ubuntu 22.04 で、最初に Git をアップグレード。頑固な対立から抜け出せなくなっていませんか? GitTree サポートに問い合わせてください。
よくある質問
Git でマージ競合が発生する原因は何ですか?
マージ競合は、2 つのブランチがファイルの同じ行を異なる方法で変更した場合、または一方のブランチが変更したファイルを削除した場合、もう一方のブランチが変更した場合に発生します。 Git は、ファイルの異なる部分への変更を自動的に結合しますが、同じ行に対する 2 つの編集のどちらかを選択することはできないため、停止して決定を求めるように求められます。
Git でマージをキャンセルするにはどうすればよいですか?
競合によりマージが停止している間に git merge --abort を実行します。 Git はブランチ、インデックス、作業ツリーをマージ開始前の状態に戻します。リベース、チェリーピック、またはリバートの場合は、git rebase --abort、git cherry-pick --abort、または git revert --abort を使用します。マージがすでにコミットとして終了している場合、中止は適用されなくなります。代わりに、リセットまたは元に戻すことでマージを元に戻します。
「すべてのマージ競合を編集し、git add を使用して解決済みとしてマークする必要があります」とはどういう意味ですか?
通常は git rebase --continue を使用して続行しようとすると、Git はそれを出力しますが、ファイルは依然として競合しているものとしてカウントされます。マージされていないパスの下にリストされている各ファイル git status を開き、競合マーカーを削除し、ファイルに対して git add を実行して、再度続行します。 git diff --check を実行すると、最初に見逃したマーカーが表示されます。
競合がある場合にマージを中止しても安全ですか?
はい、最初に自分の作業をコミットまたは隠した場合は可能です。 git merge --abort は、マージ前のブランチ、インデックス、作業ツリーを復元し、解決策を破棄します。マージ前にコミットされていない編集内容は正確に戻らない可能性があるため、最初にコミットまたはスタッシュすることが重要です。 GitTree は、中止によってドロップされたものすべてのスナップショットを作成するため、Undo で回復できます。
Git の競合において、私たちのものと彼らのものは何を意味するのでしょうか?
マージでは、「ours」は現在いるブランチ (HEAD) で、「theirs」はマージされるブランチです。リベースでは、これらが交換されます。「ours」はリベース先のブランチで、「theirs」は再生される自分のコミットです。それが、git checkout --ours がリベース中に人々を驚かせる理由です。 GitTree は、各側にブランチ名と役割をラベル付けします。
すでにコミットしたマージを取り消すにはどうすればよいですか?
プッシュしていない場合は、マージ直後に git reset --hard ORIG_HEAD を実行するか、git reset --merge ORIG_HEAD を実行してコミットされていない変更を保持します。マージがすでに共有ブランチ上にある場合は、git revert -m 1 <merge-commit> を実行して履歴を書き換えずにマージを元に戻します。 GitTree で、コミット メニューからブランチをマージの最初の親にリセットします。リセットは最初にスナップショットされるため、気が変わった場合は「元に戻す」で元に戻すことができます。
Git マージ競合を解決するのに最適なツールは何ですか?
一度に 3 つのバージョン (自分側、受信側、共通ベース) を表示し、競合ごとに競合を判断でき、マーカーが残ったファイルを保存しないマージ競合ツールを探してください。 GitTree にはそのような 3 方向エディタが含まれており、すでに使用しているマージ ツールにファイルを渡すこともできます。いずれにしても、zdiff3 をオンにしてください。
次回、Git は同じ競合を自動的に解決できますか?
はい、レレレで。 git config --global rerere.enabled true を実行すると、各競合の解決方法が Git に記録されます。まったく同じ競合が再び発生した場合 (たとえば、リベースの繰り返し中)、Git は以前の解決策をファイルに書き込みます。 rerere.autoUpdate がオンになっていない限り、レビューとステージングを行うことができます。 GitTree は、解像度がいつ再利用されたかを示します。
情報源
他の製品に関する申し立ては、2026年10月28日 の公式ページと照合して確認されました。価格と機能は変更されます。ベンダーのページが真実の情報源です。
- Git ドキュメント: git merge (競合が発生して解決される方法、--abort、ORIG_HEAD)
- Git ドキュメント: git merge-tree (--write-tree、--name-only、終了ステータス)
- Git 2.38 リリース ノート (新しい git merge-tree モード)
- Git ドキュメント: git config (merge.conflictStyle、rerere.enabled、rerere.autoUpdate)
- Git ドキュメント: git rerere
- Git ドキュメント: git checkout (--ours および --theirs)
- Git ドキュメント: git diff (--check)
- Git ドキュメント: git mergetool
- Git ドキュメント: git restart (ORIG_HEAD とのマージを元に戻す)
- Git ドキュメント: git revert (マージ コミットの場合は -m)