症状
git stash pop を実行したらコンフリクトが発生し、stash が消えずに残っている。
結論:まずこれを確認
git statusでコンフリクトしているファイルを確認する- コンフリクトを手動で解消してから
git addする - stash は自動で消えないので、解消後に
git stash dropで手動削除する
操作フロー
flowchart TD
A[git stash pop でコンフリクト発生] --> B{git status で状態確認}
B --> C[コンフリクトファイルを特定]
C --> D{コンフリクトを解消できる?}
D -->|Yes| E[ファイルを編集してコンフリクト解消]
D -->|No| F[git checkout --theirs or --ours で選択]
E --> G[git add でステージング]
F --> G
G --> H[git stash drop で stash 削除]
H --> I[解決完了]
D -->|中断したい| J[git checkout -- ファイル名]
J --> K[stash は残ったまま]
よくある原因
- 同じファイルを編集していた - stash 保存時と現在のブランチで同一ファイルに変更がある
- ブランチを切り替えた後に pop した - 想定と異なるブランチで pop を実行した
- 他のメンバーの変更が取り込まれた - pull 後に stash pop したため差分が生じた
- stash が古い - 長期間放置した stash を適用しようとした
- 複数の stash を混同した - 意図しない stash を pop した
- ファイル名やパスが変更された - リネーム後のファイルに適用しようとした
操作手順
ステップ1: 現在の状態を確認する
git status
🔍 チェックポイント: both modified: と表示されているファイルがコンフリクト対象
出力例:
On branch main
Unmerged paths:
(use "git restore --staged <file>..." to unstage)
(use "git add <file>..." to mark resolution)
both modified: src/app.js
ステップ2: コンフリクトの内容を確認する
git diff
ファイルを開くと以下のようなマーカーがある:
<<<<<<< Updated upstream
現在のブランチの内容
=======
stash の内容
>>>>>>> Stashed changes
🔍 チェックポイント: <<<<<<< と >>>>>>> のマーカーが見える
ステップ3: コンフリクトを解消する
方法A: 手動でファイルを編集
エディタでファイルを開き、マーカーを削除して正しい内容に修正する。
方法B: どちらか一方を採用する
現在のブランチの内容を採用する場合:
git checkout --ours src/app.js
stash の内容を採用する場合:
git checkout --theirs src/app.js
🔍 チェックポイント: マーカーがファイルから消えている
ステップ4: 解消したファイルをステージングする
git add src/app.js
複数ファイルがある場合:
git add .
🔍 チェックポイント: git status で Unmerged paths が消えている
ステップ5: stash を削除する
コンフリクト時は stash が自動削除されない。手動で削除する:
git stash list
最新の stash を削除:
git stash drop
特定の stash を削除:
git stash drop stash@{0}
🔍 チェックポイント: git stash list で該当 stash が消えている
ステップ6: 必要に応じてコミットする
git commit -m "resolve stash conflict"
NG行動
- コンフリクトを解消せずに
git stash dropする - 変更内容が失われる可能性がある git reset --hardを実行する - 作業中の変更がすべて消える- コンフリクトマーカーを残したままコミットする - コードが壊れた状態で保存される
- 状況を確認せずに
--oursや--theirsを使う - 意図しない内容で上書きされる
よくある質問(FAQ)
Q1: コンフリクト解消を中断して元に戻したい場合は?
git checkout -- ファイル名
を実行すると、そのファイルへの stash の適用を取り消せる。stash 自体は残るため、後で再度 git stash pop できる。
Q2: stash pop ではなく stash apply を使うべき?
git stash apply は成功しても stash を削除しない。コンフリクトの可能性がある場合は apply を使い、問題ないことを確認してから git stash drop する方が安全。
Q3: どの stash が適用されたか確認したい
git stash show -p stash@{0}
で stash の内容を確認できる。-p オプションで差分詳細が表示される。
関連するトラブル
準備中
解決しない場合
- Git公式ドキュメント - git-stash
- 確認すべき情報:
git stash listの出力git statusの出力git log --oneline -5で最近のコミット履歴
- 次に調べるキーワード:「git merge conflict 解消」「git stash 復元」