科技 · 實用指南
Git 提示未追蹤檔案會被合併覆寫?先保存並逐路徑分類
把拒絕合併視為安全邊界:複製錯誤列出的路徑,核實上游追蹤與本機忽略狀態,再於定向清理前選擇可逆移動或暫存。

當寫入上游已追蹤路徑會覆寫目前索引無法安全代表的本機路徑時,Git 會停止 merge、pull 或 checkout。這個拒絕是在保護位元組,並不表示本機檔案可以刪除,也不代表一條萬用命令安全。
先為錯誤列出的每個路徑建立證據表。在工作樹外保存原始位元組,判斷目前狀態與上游身分,再決定移動、stash、納入版本控制、定向 clean 或交由所有者處理。
1. 停止操作並保存錯誤路徑
在執行 reset、checkout、clean、pull 或再次 merge 前,複製完整錯誤與路徑清單。記錄 git status --short --untracked-files=all、目前分支與 HEAD、失敗命令及整合目標。
在工作樹外複製每個路徑;重要檔案同時記錄權限與校驗值。檢查巢狀 .git、密鑰、生成產物、本機設定或不可替代工作。備份不代表可公開敏感檔案。
2. 逐路徑核實本機狀態與上游歸屬
從儲存庫頂層使用 git ls-files --error-unmatch 檢查追蹤,--others --exclude-standard 列未追蹤項,加入 --ignored 查看被忽略項;git check-ignore -v 可指出規則來源。
fetch 後用 git ls-tree -r --name-only <target> -- path 檢查目標提交是否擁有該名稱。檔案/目錄衝突、大小寫差異、稀疏簽出、子模組與巢狀儲存庫須另行處理。
3. 選擇可逆的保存分支
本機路徑有價值但只應留在本機時,把原件移出工作樹,讓上游檔案落位後再整合。若應納入版本控制,先確認所有權與密鑰再提交;不要只為消除錯誤製造臨時提交。
普通 git stash 不承諾包含未追蹤路徑。--include-untracked 會加入未追蹤檔;--all 還會加入 ignored 檔並清理工作樹。使用說明訊息,確認還原前優先 apply 而非 pop。
4. 只對已證明可丟棄路徑使用 clean
git clean 會刪除未追蹤內容。先對精確 pathspec 執行 git clean -n。-d 進入未追蹤目錄,-x 包含 ignored 檔,-X 只刪 ignored 檔;這些選項不能互換。
Git 的 force 與巢狀儲存庫保護不是資料分類系統。不要因 dry-run 看似熟悉就執行廣泛的 git clean -fdx。先保存有價值的位元組,再逐項決定。
5. 重試原操作並驗證邊界
移動、暫存或有意刪除衝突名稱後,只重試一次原 merge、pull 或 checkout。核對預期提交,逐路徑還原本機內容並執行專案檢查,完成前不要刪除備份。
我們的 Git 2.39.2 隔離夾具重現本機未追蹤與上游追蹤的同路徑碰撞;merge 停止且校驗值不變。它未涵蓋稀疏簽出、大小寫折疊、子模組、巢狀儲存庫、Git LFS、IDE、CI 或密鑰管理。
