コンテンツにスキップ
GitTree
Git ガイド1 分で読みました

履歴を書き換えずに Git でマージコミットを元に戻す方法

マージ コミットには 2 つの親があるため、Git はどちらの側を保持するかを認識する必要があります。ここでは、親を選択し、共有ブランチでマージを安全に元に戻し、後で作業を戻す方法を示します。

作者 Kodmora

GitTree の背後にあるソフトウェア ハウス

更新されました
  • マージ
  • 元に戻すと回復
  • コミット履歴
このページでは

マージ コミットを元に戻すには、`git revert -m 1 <merge-commit>` を実行します。 -m 1 は、マージ先のブランチである最初の親を保持し、マージによってもたらされたすべてを元に戻すように Git に指示します。Git は新しいコミットを追加するため、履歴はそのまま残り、修正を共有ブランチに安全にプッシュできます。

マージコミットを元に戻すにはどうすればよいですか?

まずマージコミットを見つけます。グラフは、これを 2 つの親を持つコミットとして示しています。

git log --oneline --graph -10

次に、その親を確認します。コミット後に出力される最初のハッシュは親 1、2 番目のハッシュは親 2 です。

git log -1 --format="%h parents: %p" <merge-commit>

親 1 を維持したまま元に戻し、他のコミットと同様に新しいコミットをプッシュします。

git revert -m 1 <merge-commit>
git push

何も書き換えられないため、リセットしたり強制的にプルしたりする必要はありません。元に戻すことが競合する場合は、ファイルを修正し、ステージングして、git revert --continue を実行します。取り消すには、git revert --abort を実行します。

Git が「コミットはマージですが、-m オプションが指定されていません」と表示されるのはなぜですか?

通常のコミットには親が 1 つあるため、その差分は明らかです。マージ コミットには 2 つがあるため、git revert <merge-commit> はどちらの側に戻りたいのかを判断できません。 Git はこのエラーで停止し、何も変更されません。

error: commit 4f2a9c1 is a merge but no -m option was given.
fatal: revert failed

-m に親番号を追加して、再度実行します。

-m 1 または -m 2 を使用する必要がありますか?

各親番号が保持するもの
オプションキープするこんなときに使います
-m 1マージ先のブランチ(main など)機能がマージされたため、削除する必要があります。これはよくあるケースです。
-m 2マージされたブランチmain を機能ブランチにプルしましたが、main からのものを削除したいと考えています。

元に戻した後に同じブランチを再度マージするにはどうすればよいですか?

これが罠です。 Git のドキュメントにあるように、マージを元に戻すことは、「マージによってもたらされるツリーの変更を決して望まないことを宣言する」ことになります。ブランチのコミットは依然として main の祖先であるため、2 番目の git merge は元に戻した後に作成されたコミットのみをもたらします。

元の作業に戻すには、最初にリバートを元に戻してから、修正されたブランチをマージします。

git revert <revert-commit>
git merge feature/search

マージがまだプッシュされていない場合はどうなりますか?

元に戻すのではなく、マージを削除することもできます。 Git はマージ前のコミットを ORIG_HEAD に記録し、--merge は、リセットによって上書きされる無関係なローカル編集に触れるのを拒否します。

git reset --merge ORIG_HEAD

マージがまだ進行中で競合がある場合は、マージ コミットがまだないため、git merge --abort を使用します。やりすぎた場合はリセット、リベース、またはコミットを元に戻す方法を参照し、この選択の背後にあるルールについては共有履歴の元に戻すかリセットに関するレッスンを読んでください。

GitTree のマージコミットを元に戻す方法

  1. コミットのメニューを開く

    コミット グラフでマージを見つけて右クリックします。

  2. 「コミットを元に戻す」を選択します

    マージには 2 つの親があるため、GitTree はどちらに対して測定するかを尋ねます。最初の親 (マージされたブランチ) が通常の選択であり、2 番目の親 (マージされたブランチ) がもう 1 つです。

  3. 結果を確認する

    GitTree には Reverted. と表示され、新しいコミットがブランチの一番上の行になります。競合する場合は、ファイルを解決し、Continue または Abort... を押して元に戻ります。

一度に複数のコミットを含む完全なガイドについては、cherry-pick and revert in GitTree を参照してください。

GitTree グラフのコミット メニューには、マージ コミットを含む任意のコミットに対するコミットの取り消しが表示されます。
GitTree グラフのコミット メニューには、マージ コミットを含む任意のコミットに対するコミットの取り消しが表示されます。

よくある質問

git revert はマージコミットを削除しますか?

いいえ、マージは履歴に残ります。 Git は変更を元に戻す新しいコミットを追加するため、共有ブランチ上では安全です。

git revert の -m 1 は何を意味しますか?

保持するメインラインの親に名前を付けます。親 1 はマージを実行したときにいたブランチであるため、-m 1 は他のブランチが取り込んだものを削除します。

すでにプッシュされているマージを元に戻すことはできますか?

はい、これはそのための適切なツールです。元に戻すとコミットが追加されるため、通常どおりプッシュすれば、誰も何も書き直す必要がありません。

2 回目のマージで何も戻らなかったのはなぜですか?

戻されたブランチのコミットはすでに履歴にあるため、Git はそれらをマージされたものとして扱います。コミットを元に戻してから、再度マージします。

まだ進行中のマージを元に戻すにはどうすればよいですか?

git merge --abortを実行します。マージを停止し、ファイルを開始前の状態に戻します。

情報源

他の製品に関する申し立ては、2026年11月7日 の公式ページと照合して確認されました。価格と機能は変更されます。ベンダーのページが真実の情報源です。