できない.dev

Git merge でコンフリクトが解決できない

merge 中のコンフリクトは衝突マーカーを編集して git add し、git commit で完了する。
中断したい場合は git merge --abort で開始前に戻せる。

#merge#conflict#resolution#abort

公開: 更新:

要約

git merge 中に表示される CONFLICT (content): は、両方のブランチが同じ箇所を変更したため自動マージできなかった意味。
衝突マーカーを編集して git add し、最後に git commit を打てば merge は完了する。
途中でやめたい場合は git merge --abort で開始前の状態に戻せる。

よくある原因

  1. マーカー残り: <<<<<<< ======= >>>>>>> を消し忘れたまま git add し、ビルドが壊れたコードがコミットされる
  2. commit を打ち忘れる: 衝突を解消したが git commit を打たず、merge in progress のまま放置している
  3. abort を知らない: 解消が難しく行き詰まり、リポジトリを clone し直すと考えてしまう
  4. バイナリ衝突: 画像や PDF など差分でマージできないファイルが衝突している

解決策

1. 標準的な解消フロー

git merge feature
# CONFLICT が出たら
$EDITOR path/to/file        # マーカーを消し、正しい内容に編集
git add path/to/file
git commit                  # 既定のメッセージのまま OK

git status で「Unmerged paths」の一覧を見ながら 1 ファイルずつ片付ける。
詳細は git-merge 公式ドキュメント の「HOW CONFLICTS ARE PRESENTED」を参照。

2. 中断して元に戻す

git merge --abort

merge 開始直前の HEAD に戻る。未コミットのローカル変更は失われない
手詰まりになったらまずこれで初期状態に戻すのが安全。

3. 状態確認

git status
# You have unmerged paths.
git diff --name-only --diff-filter=U

衝突しているファイルだけを抽出できる。
merge 中は HEAD と MERGE_HEAD の 2 つのコミットが指される。

4. バイナリ衝突は片側採用

git checkout --ours  path/to/image.png   # 自分側を採用
git checkout --theirs path/to/image.png  # 相手側を採用
git add path/to/image.png

テキストエディタで開けないファイルはどちらかを丸ごと採用する。--ours--theirs は merge 中だけ意味を持つ点に注意。

実行例

実際に alpine/git 環境(git 2.52.0)で上記の手順を動かすと、git merge feature は終了コード 1 で CONFLICT (content) を発生させ、git checkout --theirs による採用と git commit を経て終了コード 0 で merge が完了した。

== versions ==
git version 2.52.0
== run ==
--- git merge feature (CONFLICT を想定)---
Auto-merging f.txt
CONFLICT (content): Merge conflict in f.txt
Automatic merge failed; fix conflicts and then commit the result.
merge の終了コード: 1
--- git status --short ---
UU f.txt
--- 解決: feature 側を採用して add → commit ---
Updated 1 path from the index
commit の終了コード: 0
--- 解決後の git log --oneline ---
47f89e2 resolve conflict (take feature)
13a18fa main
de88a32 feature
67cb381 init

— 2026-05-28 時点の出力

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