症状

git stash pop を実行したらコンフリクトが発生し、stash が消えずに残っている。

結論:まずこれを確認

  1. git status でコンフリクトしているファイルを確認する
  2. コンフリクトを手動で解消してから git add する
  3. 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 statusUnmerged 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 復元」