剛執行git add,發現選錯檔案,只想把它從暫存區拿出來,卻看到有人建議用git restore。先停一下:有沒有加--staged,會決定你改的是暫存區,還是手上尚未提交的檔案。
取消暫存不等於丟掉修改。還原工作區則可能直接覆蓋未提交內容;如果沒有另外保存,不要指望Git一定找得回來。
先看兩份差異,把要保留的內容存好
在執行還原前,先確認目前位於正確的儲存庫,再查看:
git status --short
git diff
git diff --cached
git diff通常比較工作區與暫存區;git diff --cached比較暫存區與HEAD。尚未追蹤的檔案不會因此全部出現在差異裡,重要檔案請另外複製到儲存庫外保存。
若要暫存目前變更,也可以先了解git stash push --include-untracked。它會把未追蹤檔案一起收進stash,但不是整個資料夾備份,忽略檔案也不會只因這個選項就全部保存。恢復stash可能遇到衝突,先在自己的練習儲存庫確認,再用於真實工作。
只取消git add:選--staged
以下命令針對一個已追蹤的檔案,取消它的暫存;在沒有另指定來源時,暫存區會回到HEAD的內容,工作區修改保留:
git restore --staged -- story.txt
假設同一個檔案有三個版本:HEAD是A、已暫存內容是B、手上的檔案又改成C。執行上面的命令後,暫存區回到A,檔案仍是C。再次查看兩份diff,就能確認自己取消的是暫存,而不是修改。
不加--staged:預設是用暫存區還原檔案
git restore -- story.txt
這個命令預設修改工作區,來源是暫存區,不是一律回到HEAD。若從同樣的A、B、C狀態執行,手上的C會被B覆蓋,HEAD仍是A。
因此,若你剛取消暫存,暫存區已回到A,再執行這個命令,工作區就會拿A來還原。不要把它當作「取消git add」的同義寫法,也別隨手把--staged與--worktree一起加上;兩個位置都還原,是另一個需要明確決定的動作。
範例只針對story.txt,旁邊的未追蹤檔案沒有被這次操作改動。這不表示所有還原選項都保留所有檔案:指定其他來源時,來源裡缺少的已追蹤路徑可能被移除。拿不準時,先停止並保存內容,而不是換一串更長的命令試運氣。
做完,再看檔案而不是只看命令成功
打開story.txt核對文字,再看git status --short及兩份diff。若目標只是取消暫存,應確認工作區內容還在;若要丟棄修改,必須事先知道將由哪個版本取代。
先用新建的儲存庫與練習檔案試一次,不需要連到遠端或執行push。把備份、stash保存與恢復也走一遍,確認要保留的內容仍在,再回到自己的網站檔案操作;沒有另外保存的修改,不能把救援希望全放在Git上。
參考資料
資料查核:2026年10月2日。

評論0