できない.dev

Git revert でコンフリクトが出て元に戻せない

git revert でコンフリクトが発生したら、衝突箇所を手動で解決して git add → git revert --continue で続行する。
途中で諦める場合は git revert --abort で revert 自体を取り消せる。
マージコミットを revert するときは -m で親番号の指定が必須。

公開: 更新:

要約

git revert でコンフリクトが出るのは、revert したい変更と現在の HEAD の内容が同じ行で食い違っているため。
コンフリクトマーカーを手動で編集 → git addgit revert --continue の順で進めれば再開できる。
途中で諦めるなら git revert --abort
マージコミットを revert する場合は -m で親番号の指定が必須。

よくある原因

  1. revert 対象のコミットが触ったファイルを、その後の別コミットがさらに変更しており、Git が自動で打ち消し差分を当てられない。
  2. マージコミットには親が 2 つあるため、git revert <merge-commit> だけでは「どちらの親に戻すか」を Git が決められず fatal: commit ... is a merge but no -m option was given で失敗する。
  3. コンフリクト解決中に git commit だけ実行してしまい、REVERT_HEAD の状態が解除されないまま履歴が中途半端になる。
  4. 既に手動で部分的に元に戻したコード片を、もう一度 git revert でも消そうとして同じ行を二重に削ろうとする。

解決策

1. コンフリクトマーカーを解決して continue する

git status                       # Unmerged paths: の一覧を確認
# エディタで <<<<<<< ======= >>>>>>> を編集
git add path/to/file
git revert --continue            # revert のコミットメッセージを編集して確定

--continue の代わりに git commit を打っても進めるが、git revert --continue を使うとデフォルトメッセージ(Revert "...")が自動で入る。

2. マージコミットの revert は親番号を指定する

git revert -m 1 <merge-commit>

-m 1 は「1 番目の親(通常は main 側)を残し、もう一方の親が持ち込んだ差分を打ち消す」という意味。
詳しくは 公式ドキュメント(新しいタブで開く)-m parent-number を参照。

3. 途中で諦めて元に戻す

git revert --abort

revert を始める前の HEAD と作業ツリーに戻る。--quit だと revert 状態だけクリアして作業ツリーは残るので、用途で使い分ける。

4. 連続コミットをまとめて revert する

git revert --no-commit <old>..<new>
# 必要なら手動で調整したあと
git commit -m "Revert a..b range"

--no-commit で打ち消し差分だけステージしておくと、複数のコミットを 1 つの revert コミットにまとめられる。

実行例

実際に上記の手順を alpine/git(Git 2.54.0)で動かすと、git revert HEAD~1 の時点で f.txt にコンフリクトが発生し終了コード 1 で止まるが、コンフリクトマーカーを解消して git addgit revert --continue を実行することで終了コード 0 で完了し、Revert "C2 set line2=AAA" というコミットが積まれることを確認できる。

== versions ==
git version 2.54.0
== run ==
--- git revert HEAD~1 (=C2) (CONFLICT を想定)---
Auto-merging f.txt
CONFLICT (content): Merge conflict in f.txt
error: could not revert fdce37a... C2 set line2=AAA
hint: After resolving the conflicts, mark them with
hint: "git add/rm <pathspec>", then run
hint: "git revert --continue".
hint: You can instead skip this commit with "git revert --skip".
hint: To abort and get back to the state before "git revert",
hint: run "git revert --abort".
hint: Disable this message with "git config set advice.mergeConflict false"
revert の終了コード: 1
--- git status --short (Unmerged paths)---
UU f.txt
--- 解決: revert の意図どおり line2 を元の値に戻す → add → revert --continue ---
[master 1db9dfb] Revert "C2 set line2=AAA"
 1 file changed, 1 insertion(+), 1 deletion(-)
continue の終了コード: 0
--- 解決後の git log --oneline ---
1db9dfb Revert "C2 set line2=AAA"
ef9a3a2 C3 set line2=BBB
fdce37a C2 set line2=AAA
bf5ff87 C1 init

— 2026-06-30 時点の出力

この記事は役立ちましたか?