できない.dev

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 で一覧を確認する。

よくある原因

  1. 適用先が進んでいる: stash 作成時のブランチ HEAD と現在の HEAD が大きく食い違い、同じ行が両方で書き換わっている
  2. stash の取り違え: 別ブランチで作った stash を pop しようとし、無関係な箇所が衝突する
  3. drop し忘れ: 衝突解消後に git stash drop を打たず stash@{0} が残り続ける
  4. 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 を取り出す

popstash@{0} 固定。
違うものを取りたいときは apply <ref> を使う。

3. branch コマンドで衝突回避

git stash branch rescue/work stash@{0}

git stash branchstash 作成時の HEAD を起点に新ブランチを作って stash を適用する。
元の HEAD に戻すので衝突が起きない。
詳細は git-stash 公式ドキュメントbranch サブコマンドを参照。

4. クリーンな状態で取り出す

git status                      # 未コミット変更が無いことを確認
git stash pop

作業ツリーがクリーンであれば衝突は格段に減る。
コミットするか一時的に別 stash で退避してから pop するのが安全。

実行例

実際に上記の手順を alpine/git 環境(Git 2.52.0)で動かすと、git stash popCONFLICT (content) を出して終了コード 1 で返り、その後 git stash liststash@{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 時点の出力

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