<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>開發安全 on KnightLi的博客</title>
        <link>https://knightli.com/zh-tw/tags/%E9%96%8B%E7%99%BC%E5%AE%89%E5%85%A8/</link>
        <description>Recent content in 開發安全 on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-tw</language>
        <lastBuildDate>Fri, 10 Jul 2026 11:48:09 +0800</lastBuildDate><atom:link href="https://knightli.com/zh-tw/tags/%E9%96%8B%E7%99%BC%E5%AE%89%E5%85%A8/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>AI 編程如何避免誤刪檔案：從 Git、權限到恢復流程</title>
        <link>https://knightli.com/zh-tw/2026/07/10/ai-coding-avoid-accidental-file-deletion/</link>
        <pubDate>Fri, 10 Jul 2026 11:48:09 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/07/10/ai-coding-avoid-accidental-file-deletion/</guid>
        <description>&lt;p&gt;AI 編程最嚇人的事故，不一定是程式碼寫錯，而是檔案被刪了。&lt;/p&gt;
&lt;p&gt;Codex、Claude Code、Cursor 這類工具已經能讀寫專案檔案、執行命令、批量重構、移動目錄。一旦上下文理解錯，或者使用者給了過寬權限，它可能真的會刪檔案、覆蓋設定、清空生成物，甚至把還沒提交的改動一起處理掉。&lt;/p&gt;
&lt;p&gt;所以使用 AI 編程工具時，第一條安全原則不是「讓它更聰明」，而是：&lt;strong&gt;讓它沒有機會在錯誤範圍裡做破壞性操作。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;這篇文章整理一套實用流程：減少 AI 編程誤刪檔案的機率，並且真的刪錯時能快速恢復。&lt;/p&gt;
&lt;h2 id=&#34;先給結論防誤刪要靠多層保護&#34;&gt;先給結論：防誤刪要靠多層保護
&lt;/h2&gt;&lt;p&gt;不要把安全寄託在一句「不要刪除檔案」上。更穩的做法是疊幾層保護：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;防護層&lt;/th&gt;
          &lt;th&gt;做什麼&lt;/th&gt;
          &lt;th&gt;解決什麼問題&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Git 工作區&lt;/td&gt;
          &lt;td&gt;改動前先看 &lt;code&gt;git status&lt;/code&gt;，重要節點小步提交&lt;/td&gt;
          &lt;td&gt;誤刪後能恢復&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;工作目錄隔離&lt;/td&gt;
          &lt;td&gt;只讓 AI 在目前專案或臨時分支裡操作&lt;/td&gt;
          &lt;td&gt;避免碰到無關資料&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;危險命令確認&lt;/td&gt;
          &lt;td&gt;刪除、覆蓋、批量移動前必須人工確認&lt;/td&gt;
          &lt;td&gt;防止模型自動執行破壞性命令&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;只讀審查&lt;/td&gt;
          &lt;td&gt;先讓 AI 分析影響面，不直接改&lt;/td&gt;
          &lt;td&gt;降低大範圍誤操作&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;忽略規則&lt;/td&gt;
          &lt;td&gt;把快取、建置產物、密鑰、資料目錄排除&lt;/td&gt;
          &lt;td&gt;防止把不該碰的檔案納入任務&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;恢復流程&lt;/td&gt;
          &lt;td&gt;準備 &lt;code&gt;git restore&lt;/code&gt;、資源回收筒、備份和快照&lt;/td&gt;
          &lt;td&gt;出事後不慌&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;最重要的是：&lt;strong&gt;AI 能改檔案之前，專案必須有可恢復的狀態。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;最容易誤刪的幾種場景&#34;&gt;最容易誤刪的幾種場景
&lt;/h2&gt;&lt;h3 id=&#34;1-幫我清理專案&#34;&gt;1. 「幫我清理專案」
&lt;/h3&gt;&lt;p&gt;這句話風險很高。AI 可能理解成刪除未引用檔案、舊元件、重複腳本、看起來沒用的 Markdown，或清理 &lt;code&gt;tmp&lt;/code&gt;、&lt;code&gt;dist&lt;/code&gt;、&lt;code&gt;build&lt;/code&gt;、&lt;code&gt;public&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;但真實專案裡，「看起來沒用」和「真的沒用」差很多。有些檔案只在 CI、部署腳本、文件站、動態載入或插件機制裡被引用。&lt;/p&gt;
&lt;p&gt;更安全的說法是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;先只列出你認為可以清理的檔案和原因，不要刪除。等我確認後再處理。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;2-重構一下目錄結構&#34;&gt;2. 「重構一下目錄結構」
&lt;/h3&gt;&lt;p&gt;移動檔案比修改程式碼更危險，因為它會影響 import、靜態資源路徑、框架約定目錄、CI/CD、文件連結、多語內容和部署產物。&lt;/p&gt;
&lt;p&gt;更安全的流程是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先生成遷移計畫。&lt;/li&gt;
&lt;li&gt;列出會移動的檔案。&lt;/li&gt;
&lt;li&gt;列出會改的引用。&lt;/li&gt;
&lt;li&gt;小批量執行。&lt;/li&gt;
&lt;li&gt;每批後跑檢查。&lt;/li&gt;
&lt;li&gt;確認無誤後再刪除舊路徑。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;3-把沒用的都刪掉&#34;&gt;3. 「把沒用的都刪掉」
&lt;/h3&gt;&lt;p&gt;「沒用」必須有判斷標準。否則 AI 可能根據檔名、更新時間、搜尋結果來猜。&lt;/p&gt;
&lt;p&gt;建議改成：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;請只找出沒有被靜態引用的候選檔案，按風險分級列出來，不要刪除。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;再追問：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;這些檔案是否可能被執行期動態載入、設定檔引用、建置腳本引用或部署流程使用？
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;第一步改動前必須看-git-狀態&#34;&gt;第一步：改動前必須看 Git 狀態
&lt;/h2&gt;&lt;p&gt;AI 動手前，先看：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git status --short
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果工作區已經有很多未提交改動，風險會變高，因為 AI 誤刪後，你很難區分哪些是它刪的，哪些是你之前改的。&lt;/p&gt;
&lt;p&gt;推薦規則：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;乾淨工作區：適合讓 AI 修改。&lt;/li&gt;
&lt;li&gt;少量已知改動：可以繼續，但要明確「不要碰這些檔案」。&lt;/li&gt;
&lt;li&gt;大量未提交改動：先提交、stash 或備份。&lt;/li&gt;
&lt;li&gt;有重要未跟蹤檔案：先確認是否納入 Git，別讓 AI 當成垃圾檔刪掉。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;未跟蹤檔案尤其危險：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;?? notes.md
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;?? scripts/new-tool.ps1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;?? content/post/2026/07/41/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這些檔案不在 Git 歷史裡，被刪後 &lt;code&gt;git restore&lt;/code&gt; 救不回來。&lt;/p&gt;
&lt;h2 id=&#34;第二步小步提交留恢復點&#34;&gt;第二步：小步提交留恢復點
&lt;/h2&gt;&lt;p&gt;讓 AI 做大改前，先做安全提交：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git commit -m &lt;span class=&#34;s2&#34;&gt;&amp;#34;chore: save working state before ai changes&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果不想正式提交，也可以 stash：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git stash push -u -m &lt;span class=&#34;s2&#34;&gt;&amp;#34;before ai changes&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;-u&lt;/code&gt; 很重要，它會把未跟蹤檔案也一起保存。日常更推薦小步提交，因為可見、可比較、可回滾。&lt;/p&gt;
&lt;h2 id=&#34;第三步把-ai-限制在正確目錄裡&#34;&gt;第三步：把 AI 限制在正確目錄裡
&lt;/h2&gt;&lt;p&gt;不要在使用者目錄、下載目錄、桌面根目錄直接開 AI 編程工具。&lt;/p&gt;
&lt;p&gt;更安全的做法是在專案根目錄裡執行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; C:&lt;span class=&#34;se&#34;&gt;\W&lt;/span&gt;ork&lt;span class=&#34;se&#34;&gt;\m&lt;/span&gt;y-project
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然後明確告訴 AI：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;只允許修改目前倉庫裡的檔案。不要讀取或修改倉庫外路徑。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;臨時檔案也要指定位置：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;所有臨時檔案都放到 tmp/ai-work/，不要在其他目錄建立或刪除臨時檔案。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;高風險改動可使用 Git worktree：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git worktree add ../my-project-ai-test -b ai-test
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;第四步危險命令要人工確認&#34;&gt;第四步：危險命令要人工確認
&lt;/h2&gt;&lt;p&gt;AI 編程裡最需要警惕的是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -rf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;del /s
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Remove-Item -Recurse
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clean -fd
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git reset --hard
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git checkout -- .
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mv
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;move
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;robocopy /MIR
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rsync --delete
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;它們不是一定不能用，但必須知道目標路徑、影響範圍和恢復方式。&lt;/p&gt;
&lt;p&gt;Windows PowerShell 裡尤其要小心：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;Remove-Item&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Recurse&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Force&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;更安全的要求是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;遇到刪除、覆蓋、批量移動、git reset、git clean、rsync --delete 這類操作時，先停下來說明目標路徑和影響範圍，等我確認。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;第五步先審查再刪除&#34;&gt;第五步：先審查，再刪除
&lt;/h2&gt;&lt;p&gt;AI 很適合幫你找「候選刪除項」，但不應該直接決定刪除。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;檔案&lt;/th&gt;
          &lt;th&gt;AI 判斷原因&lt;/th&gt;
          &lt;th&gt;風險等級&lt;/th&gt;
          &lt;th&gt;是否建議刪除&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;old-script.js&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;沒有靜態引用&lt;/td&gt;
          &lt;td&gt;中&lt;/td&gt;
          &lt;td&gt;需人工確認&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;dist/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;建置產物&lt;/td&gt;
          &lt;td&gt;低&lt;/td&gt;
          &lt;td&gt;可刪但需確認&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;legacy-config.json&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;名稱像舊設定&lt;/td&gt;
          &lt;td&gt;高&lt;/td&gt;
          &lt;td&gt;不建議直接刪&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;然後繼續追問是否可能被設定檔、CI、部署腳本、dynamic import 或文件連結引用。&lt;/p&gt;
&lt;p&gt;如果你用 Claude Code subagent，可以建一個只讀 &lt;code&gt;cleanup-reviewer&lt;/code&gt;，只允許它列候選檔案，不允許修改。關於 subagent 的使用場景，可以看：/zh-tw/2026/07/10/claude-code-subagent-project-fit-guide/。&lt;/p&gt;
&lt;h2 id=&#34;第六步把專案規則寫進-ai-記憶檔案&#34;&gt;第六步：把專案規則寫進 AI 記憶檔案
&lt;/h2&gt;&lt;p&gt;可以在 &lt;code&gt;AGENTS.md&lt;/code&gt;、&lt;code&gt;CLAUDE.md&lt;/code&gt; 或工具支援的專案說明檔裡加入：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gh&#34;&gt;# File Safety Rules
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Do not delete files unless the user explicitly asks for deletion.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Before deleting, moving, or overwriting files, list the exact paths and wait for confirmation.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Never run git reset --hard, git clean -fd, rm -rf, Remove-Item -Recurse, rsync --delete, or robocopy /MIR without explicit confirmation.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Do not modify files outside the repository root.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Treat untracked files as user-created files, not disposable temporary files.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Prefer small edits and small commits.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;中文專案也可以直接寫中文：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gh&#34;&gt;# 文件安全規則
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; 不要主動刪除檔案。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; 刪除、移動、覆蓋前，必須先列出完整路徑和原因。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; 未跟蹤檔案預設視為使用者檔案，不要當成臨時檔案處理。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; 不要執行 &lt;span class=&#34;sb&#34;&gt;`git reset --hard`&lt;/span&gt;、&lt;span class=&#34;sb&#34;&gt;`git clean -fd`&lt;/span&gt;、&lt;span class=&#34;sb&#34;&gt;`Remove-Item -Recurse`&lt;/span&gt; 等破壞性命令，除非使用者明確確認。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; 不要修改倉庫外的檔案。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這類規則不能保證 100% 不出錯，但能顯著減少 AI 自作主張。&lt;/p&gt;
&lt;p&gt;如果你已經整理多專案記憶，可以把「哪些目錄不能碰、哪些命令必須確認、哪些檔案是生成物」放進專案級記憶。相關方法可參考：/zh-tw/2026/07/08/claude-code-multi-project-memory-team-workflow/。&lt;/p&gt;
&lt;h2 id=&#34;第七步區分原始碼生成物和使用者資料&#34;&gt;第七步：區分原始碼、生成物和使用者資料
&lt;/h2&gt;&lt;p&gt;很多誤刪來自「檔案性質不清」。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;類型&lt;/th&gt;
          &lt;th&gt;示例&lt;/th&gt;
          &lt;th&gt;AI 能不能刪&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;原始碼&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;src/&lt;/code&gt;, &lt;code&gt;app/&lt;/code&gt;, &lt;code&gt;content/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;不能直接刪&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;設定&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;.env.example&lt;/code&gt;, &lt;code&gt;config/&lt;/code&gt;, &lt;code&gt;package.json&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;高風險&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;生成物&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;dist/&lt;/code&gt;, &lt;code&gt;build/&lt;/code&gt;, &lt;code&gt;public/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;可重建時才可刪&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;快取&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;.cache/&lt;/code&gt;, &lt;code&gt;.next/cache/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;通常可刪&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;使用者資料&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;uploads/&lt;/code&gt;, &lt;code&gt;data/&lt;/code&gt;, &lt;code&gt;notes/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;預設禁止&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;本地密鑰&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;*.key&lt;/code&gt;, &lt;code&gt;secrets/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;預設禁止讀取和修改&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;最好在 README 或 AI 規則檔裡寫清楚：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gu&#34;&gt;## Directory Notes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;sb&#34;&gt;`content/`&lt;/span&gt; is source content. Do not delete posts.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;sb&#34;&gt;`public/`&lt;/span&gt; is generated by Hugo and can be rebuilt.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;sb&#34;&gt;`.env`&lt;/span&gt; and &lt;span class=&#34;sb&#34;&gt;`secrets/`&lt;/span&gt; must not be read or modified.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;sb&#34;&gt;`tmp/ai-work/`&lt;/span&gt; is the only allowed temporary workspace.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;第八步提前會恢復流程&#34;&gt;第八步：提前會恢復流程
&lt;/h2&gt;&lt;p&gt;真的誤刪了，先別繼續讓 AI 大量修改。&lt;/p&gt;
&lt;p&gt;恢復已跟蹤檔案：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git status --short
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git restore path/to/file
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git restore path/to/directory
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git restore --source HEAD~1 path/to/file
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;從歷史恢復：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git log -- path/to/file
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git restore --source &amp;lt;commit&amp;gt; path/to/file
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果是未跟蹤檔案，依序檢查：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;編輯器本地歷史；&lt;/li&gt;
&lt;li&gt;Windows 資源回收筒；&lt;/li&gt;
&lt;li&gt;OneDrive、Dropbox、Syncthing 等版本記錄；&lt;/li&gt;
&lt;li&gt;NAS 快照或備份；&lt;/li&gt;
&lt;li&gt;檔案恢復工具；&lt;/li&gt;
&lt;li&gt;AI 對話記錄裡是否還保留內容。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這也是為什麼大改前要先提交或 &lt;code&gt;git stash push -u&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;第九步刪除前輸出差異&#34;&gt;第九步：刪除前輸出差異
&lt;/h2&gt;&lt;p&gt;刪除前，要求 AI 先展示：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git diff --stat
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git status --short
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;並解釋哪些檔案會被刪除、哪些會被移動、哪些只是修改、哪些是未跟蹤檔案，以及刪除後如何恢復。&lt;/p&gt;
&lt;p&gt;看到這種狀態要特別小心：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;D  src/important.ts
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; D content/post/2026/07/old/index.zh-cn.md
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;?? backup/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;D&lt;/code&gt; 表示 Git 跟蹤的檔案被刪除，&lt;code&gt;??&lt;/code&gt; 表示未跟蹤檔案，Git 不會自動幫你恢復。&lt;/p&gt;
&lt;p&gt;AI 做完改動後，也應該再看一次：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git status --short
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;第十步不同工具的防護思路&#34;&gt;第十步：不同工具的防護思路
&lt;/h2&gt;&lt;h3 id=&#34;codex&#34;&gt;Codex
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;開始前看 &lt;code&gt;git status&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;明確禁止刪除未跟蹤檔案；&lt;/li&gt;
&lt;li&gt;大改前先給計畫；&lt;/li&gt;
&lt;li&gt;遇到 &lt;code&gt;Remove-Item&lt;/code&gt;、&lt;code&gt;rm -rf&lt;/code&gt;、&lt;code&gt;git clean&lt;/code&gt;、&lt;code&gt;git reset&lt;/code&gt; 要停下確認；&lt;/li&gt;
&lt;li&gt;最後回報實際改了哪些檔案。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;claude-code&#34;&gt;Claude Code
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;把檔案安全規則寫進 &lt;code&gt;CLAUDE.md&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;用 subagent 做只讀審查；&lt;/li&gt;
&lt;li&gt;hooks 避免自動觸發破壞性腳本；&lt;/li&gt;
&lt;li&gt;明確哪些命令需要人工確認。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;cursor--ide-類工具&#34;&gt;Cursor / IDE 類工具
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;不要一次性接受大範圍刪除；&lt;/li&gt;
&lt;li&gt;先看檔案樹變化；&lt;/li&gt;
&lt;li&gt;對刪除檔案逐個確認；&lt;/li&gt;
&lt;li&gt;重要專案仍以 Git 為準，不只依賴 IDE 復原。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;一套安全提示詞模板&#34;&gt;一套安全提示詞模板
&lt;/h2&gt;&lt;p&gt;以後讓 AI 做清理、重構、遷移時，可以直接用：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;請先分析，不要修改文件。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;目標：找出這次任務可能需要修改、移動或刪除的文件。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;要求：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1. 不要刪除任何文件。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2. 不要執行 git reset、git clean、rm -rf、Remove-Item -Recurse、rsync --delete、robocopy /MIR。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3. 未跟蹤文件默認視為用戶文件，不要當作臨時文件處理。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;4. 先輸出計劃、影響範圍和風險點。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;5. 如果確實建議刪除文件，列出完整路徑、原因、風險等級和恢復方式，等待我確認。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;真正要執行時，再給第二段：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;只執行我確認過的這些文件操作。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;每次刪除或移動前，再輸出目標路徑。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;完成後運行 git status --short，並匯報新增、修改、刪除的文件。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;最後ai-編程不是不刪檔案而是可控地刪&#34;&gt;最後：AI 編程不是不刪檔案，而是可控地刪
&lt;/h2&gt;&lt;p&gt;專案裡確實會有需要刪檔案的時候：廢棄元件、舊腳本、重複資源、過期文件、建置快取，都可能需要清理。&lt;/p&gt;
&lt;p&gt;關鍵不在於永遠不刪，而在於：刪除前有證據、有清單、有確認；刪除後能驗證；出錯後能恢復。&lt;/p&gt;
&lt;p&gt;AI 編程越強，越要把檔案安全當作工作流的一部分。Git、小步提交、只讀審查、權限確認、專案規則和備份恢復，能把「誤刪檔案」從災難變成可回滾的小事故。&lt;/p&gt;
&lt;p&gt;如果你的 AI Agent 經常跑長任務，還可以把每個階段的狀態、改動範圍和恢復點寫清楚，減少中斷後重複執行危險命令。這個方向可以繼續看：/zh-tw/2026/07/10/ai-agent-long-task-resume-guide/。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
