症状

git merge 実行後にコンフリクトが発生し、解消作業を中止してマージ前の状態に戻したい

結論:まずこれを確認

  1. git status で現在の状態を確認する
  2. マージ中なら git merge --abort で中止できる
  3. 作業中の変更がある場合は先に退避(stash)を検討する

操作フロー

    flowchart TD
    A[コンフリクト発生] --> B{git status で状態確認}
    B --> C{Unmerged paths あり?}
    C -->|Yes| D{作業中の変更を残す?}
    C -->|No| E[マージは完了済み]
    D -->|残さない| F[git merge --abort]
    D -->|残したい| G[git stash で退避してから abort]
    F --> H[マージ前の状態に戻る]
    G --> H
    E --> I[git reset で戻すか検討]
  

よくある原因

  • コンフリクトの量が多すぎて手に負えない - 一度中止して戦略を練り直す
  • 間違ったブランチをマージしてしまった - abort して正しいブランチを選び直す
  • コンフリクト解消中に別の変更をしてしまった - 状態が複雑になり最初からやり直したい
  • マージの方向を間違えた - feature を main にマージすべきところを逆にした
  • リモートの最新を取り込んでからマージしたい - 一度中止して pull してからやり直す

操作手順

ステップ1: 現在の状態を確認する

    git status
  

🔍 チェックポイント: 以下のような表示があればマージ中

    On branch main
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)
  

ステップ2: 未保存の変更を確認する

    git diff
  

🔍 チェックポイント: コンフリクトマーカー(<<<<<<<, =======, >>>>>>>)の有無を確認

    <<<<<<< HEAD
現在のブランチの内容
=======
マージしようとしたブランチの内容
>>>>>>> feature-branch
  

ステップ3: マージを中止する

    git merge --abort
  

🔍 チェックポイント: 実行後に git status で clean な状態になっていることを確認

    On branch main
nothing to commit, working tree clean
  

ステップ4: (任意)変更を退避してから中止する場合

コンフリクト解消中に行った変更を一時保存したい場合:

    # 現在の変更を退避
git stash --include-untracked

# マージを中止
git merge --abort

# 必要なら退避した変更を戻す
git stash pop
  

⚠️ 注意: コンフリクト状態のファイルは stash できない場合がある

ステップ5: マージ前の状態を確認する

    git log --oneline -5
git branch -v
  

🔍 チェックポイント: マージコミットが存在しないことを確認

NG行動(やってはいけないこと)

  • git reset --hard をいきなり実行する - 作業中の変更がすべて消える。abort で十分な場合が多い
  • コンフリクトマーカーを残したままコミットする - ファイルが壊れた状態で保存される
  • git checkout --theirs .--ours . を理解せず実行する - 片方の変更がすべて消える
  • マージ中に別のブランチに checkout する - 状態がさらに複雑になる

よくある質問(FAQ)

Q1: git merge --abort が効かない場合はどうする?

A: マージが完了している(コミット済み)場合は --abort は使えない。その場合は以下を検討する:

    # 直前のコミットを取り消す(変更は残る)
git reset --soft HEAD~1

# または完全に戻す(変更も消える)
git reset --hard HEAD~1
  

⚠️ 警告: --hard は変更が完全に消える。実行前に必ず git log で確認すること。

Q2: abort 後にもう一度同じマージをしたい場合は?

A: 通常通り再度マージコマンドを実行する:

    git merge feature-branch
  

Q3: コンフリクトを解消してからやっぱり中止したい場合は?

A: git add していなければ git merge --abort で戻れる。git add 済みでも git merge --abort は有効。ただしコミット済みなら git reset が必要。

関連するトラブル

準備中

解決しない場合