テクノロジー · 実用ガイド
git stash pop が失敗したら、削除前に部分的な復元を確認する
同名ファイルが未追跡ファイルの復元を妨げても、追跡対象の変更は適用済みの場合があります。両方の版を保全し、対象の stash を特定して、復元結果を比較してから削除を判断します。

stash の復元エラーは、作業ツリーが変わっていない証拠にはなりません。まず現在の状態を保全し、失敗した処理がどこまで進んだかを確認します。比較が済むまで、ローカルのファイルと stash 内の同名ファイルを別々の版として扱ってください。
1. 再試行の前に証拠を保存する
エラー全文、コマンド、Git の版、ブランチ、stash 一覧、現在の状態を保存します。git status --short --untracked-files=all --ignored と、未ステージ・ステージ済み双方の差分を確認してください。無視対象の表示も必要です。通常の状態表示がきれいでも、無視対象の同名ファイルがないとは限りません。パスを変更する前に、重要なローカルファイルと完全な Git データを独立して保全します。通常の clone や差分の書き出しでは、すべての stash と未追跡ファイルが自動で保存されるわけではありません。
Git 2.51.1 の独立した模擬リポジトリで、追跡対象の変更と未追跡ファイルを -u で保存し、その未追跡パスに別内容のローカルファイルを作りました。pop の終了コードは 1 でしたが、追跡対象の変更は適用済みで、ローカルの同名ファイルと元の stash は残りました。これは部分的な復元が起こり得る実例であり、利用者のリポジトリの診断や全バージョンでの保証ではありません。
2. stash を特定し、衝突を分類する
git stash list で目的の項目を選び、その参照に ^{commit} を付けて git rev-parse --verify で完全なオブジェクト ID を記録します。実際に選んだ参照を使い、最新の項目が目的のものだと決めつけないでください。記録した ID を git stash show --include-untracked --patch で調べ、対応する版では --only-untracked --name-only も使えます。元の項目を残してください。後の操作で番号は変わります。
エラーに出た各パスを現在のインデックスとファイルに照らします。今は未追跡、無視対象、それともこのブランチで追跡済みでしょうか。stash 作成時に保存されたでしょうか。分類が変わった可能性もあります。Atlassian は、保存した未追跡内容が stash の構造内で別に格納されると説明していますが、すべての stash がその部分を持つわけではありません。実際の内容を確認する前に、第三の親を使う一律のコマンドや上書き手順を適用しないでください。
3. 管理した場所で復元して比較する
独立した保全を確認した後、必要なローカルの同名ファイルを、復元先の外にある識別しやすい場所へ移します。削除はしません。再度 stash を適用する前に、すでに適用された追跡対象の変更を整理します。同名ファイルを移すだけでは部分的な復元は取り消されません。作業ツリーが不確かな場合は、関連する完全な Git オブジェクトを持ち、クリーンなチェックアウトを用意した独立コピーで復元し、元を変更しないでください。
git stash branch は stash 作成時の基点から作業を再構成でき、現在のブランチが進んだ場合に役立ちます。手元の版の説明に従い、準備したコピーで別の復元ブランチを使います。チェックアウトがクリーンでなければ処理が止まる場合があります。stash@{n} という名前での復元が成功すると項目が削除される場合があるため、元のリポジトリと正確な識別情報を先に保全します。復元ファイルをローカルの保全コピーと適用済みの追跡差分の両方と比較して、内容を意図的に統合します。
4. 削除の判断を別に行う
必要な追跡・未追跡・無視対象の内容と、必要ならステージ状態を確認し、想定したビルドやテストを実行します。保全した各版の場所と採用した差分を記録してください。適用に成功しても、希望した全ファイルが元から保存されていた証明にはなりません。apply は stash を残すので、項目が残っていることは何も復元されなかった意味ではありません。
復元の検証後、現在の名前が記録済みのオブジェクト ID と一致する項目だけを削除します。最初に広範囲の git clean -xfd や強制チェックアウトを使うと、比較に必要な内容を失う場合があります。範囲を限定した clean のドライランは候補を表示するだけで、バックアップはしません。必要な版が見つからない、または部分的な結果を説明できない場合は、証拠と stash を残し、復元完了とは判断しないでください。
