Git stash pop でコンフリクトが起きて取り出せない
stash pop でコンフリクトが起きると stash は drop されず stack に残る。
衝突を解消して git add したら、忘れずに git stash drop で stack から外す。
#stash#conflict#pop#apply
公開:
要約
git stash pop 中に CONFLICT (content): が出ても焦らなくて良い。
pop は 衝突発生時に stash を保持する(自動 drop しない)ため、衝突を解消して git add で進めれば作業内容は失われない。
最後に git stash drop で stack から外せば後始末も終わる。
状況を見失ったら git stash list で一覧を確認する。
よくある原因
- 適用先が進んでいる: stash 作成時のブランチ HEAD と現在の HEAD が大きく食い違い、同じ行が両方で書き換わっている
- stash の取り違え: 別ブランチで作った stash を pop しようとし、無関係な箇所が衝突する
- drop し忘れ: 衝突解消後に
git stash dropを打たずstash@{0}が残り続ける - untracked との衝突:
--include-untrackedで stash した新規ファイルと、現在の作業ツリーにある同名ファイルがぶつかる
解決策
1. 標準的な解消フロー
git stash pop
# CONFLICT が出たら
$EDITOR path/to/file
git add path/to/file
# pop 失敗時 stash は drop されないので明示的に消す
git stash drop stash@{0}衝突時の pop は実質 apply 相当の挙動になる。
後片付けを忘れると stash が積み上がっていく。
2. 対象 stash を確認
git stash list
# stash@{0}: WIP on feature: ...
# stash@{1}: On main: ...
git stash show -p stash@{1} # 中身を確認
git stash apply stash@{1} # 任意の stash を取り出すpop は stash@{0} 固定。
違うものを取りたいときは apply <ref> を使う。
3. branch コマンドで衝突回避
git stash branch rescue/work stash@{0}git stash branch は stash 作成時の HEAD を起点に新ブランチを作って stash を適用する。
元の HEAD に戻すので衝突が起きない。
詳細は git-stash 公式ドキュメント の branch サブコマンドを参照。
4. クリーンな状態で取り出す
git status # 未コミット変更が無いことを確認
git stash pop作業ツリーがクリーンであれば衝突は格段に減る。
コミットするか一時的に別 stash で退避してから pop するのが安全。
実行例
実際に上記の手順を alpine/git 環境(Git 2.52.0)で動かすと、git stash pop は CONFLICT (content) を出して終了コード 1 で返り、その後 git stash list で stash@{0} が保持されたままであることが確認できる。
== versions ==
git version 2.52.0
== run ==
--- 作業ツリーで line2 を変更して stash ---
Saved working directory and index state WIP on master: bbc1a2b init
stash の終了コード: 0
--- HEAD 側で同じ line2 を別内容に変更して commit ---
--- git stash pop (CONFLICT を想定)---
Auto-merging f.txt
CONFLICT (content): Merge conflict in f.txt
On branch master
Unmerged paths:
(use "git restore --staged <file>..." to unstage)
(use "git add <file>..." to mark resolution)
both modified: f.txt
no changes added to commit (use "git add" and/or "git commit -a")
The stash entry is kept in case you need it again.
pop の終了コード: 1
--- git stash list (pop 失敗時は drop されず残る)---
stash@{0}: WIP on master: bbc1a2b init
--- 解決: 残したい内容に編集 → add → 残った stash を drop ---
Dropped refs/stash@{0} (e547439ecea5f3dee3d1fb94775f622084f00b41)
drop の終了コード: 0
--- 解決後: git stash list (空になる)---
(出力が無ければ stash は空)— 2026-06-10 時点の出力