科技 · 實用指南
Git stash pop 失敗?清理前先核對已還原的內容
同名檔案可能阻止未追蹤檔案還原,但受追蹤檔案的修改已經套用。先保全兩個版本、確認準確的 stash,再比較還原結果,最後決定是否刪除。

Git 還原 stash 時出錯,並不能證明工作目錄毫無變化。眼下應先保全現狀,弄清失敗操作已經做了什麼。在比較之前,把本機檔案與 stash 中的同名檔案視為兩個獨立版本。
1. 再次嘗試前保留證據
保存完整錯誤、命令、Git 版本、分支、stash 清單及目前狀態。查看 git status --short --untracked-files=all --ignored,以及尚未暫存與已暫存的差異。被忽略檔案也要列出:普通狀態看似乾淨,不代表沒有被忽略的同名檔案。改動路徑前,獨立保存有價值的本機檔案與完整 Git 資料。普通複製儲存庫或匯出的差異,不會自動保全所有 stash 與未追蹤檔案。
我們在使用 Git 2.51.1 的獨立模擬儲存庫中,用 -u 保存一份受追蹤檔案修改與一個未追蹤檔案,再在相同路徑建立不同的本機內容。pop 傳回代碼 1:受追蹤檔案修改已套用,本機同名檔案未變,原 stash 仍在。這說明還原可能只完成一部分,並不說明你的儲存庫發生了同樣情況,也不是對所有版本的保證。
2. 確認 stash 並逐一分類衝突
從 git stash list 選擇目標項目,使用 git rev-parse --verify,搭配選中的 stash 參照及 ^{commit} 後綴,記錄完整物件 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,不應認定還原完成。
