現在該怎麼做
- 先查看資源回收筒;如果專案已推送到遠端儲存庫,就重新複製一份。
- 如果.git資料夾還在,用git restore、git reflog與git stash找回檔案與提交。
- 尚未提交的工作,先查看VS Code時間軸或JetBrains本機歷程,再從隨身碟執行工具掃描磁碟。
操作步驟
停止建置並查看資源回收筒
不要在該磁碟上安裝套件、建置或執行測試,這些操作會寫入成千上萬個檔案。先查看資源回收筒:在檔案總管或許多IDE中刪除的檔案通常會進入資源回收筒,而rm -rf、del、Remove-Item、git clean等指令會略過資源回收筒。
從遠端重新複製
如果專案已推送到GitHub、GitLab或其他伺服器,就把它重新複製到新的資料夾。所有已提交並推送的內容都會原樣回來,缺少的只是從未推送的本機工作。
.git還在時使用git
如果只刪除了部分檔案,git status會列出它們,git restore加上路徑通常就能還原最後一次提交的版本。誤執行git reset --hard之後,git reflog會顯示可以回到的較早提交。用git stash list查看暫時擱置的工作。只用git add暫存但從未提交的檔案,有時可以用git fsck --lost-found找到。
查看編輯器的本機歷程
在VS Code中開啟檔案的時間軸檢視,本機歷程與專案分開保存。對於已刪除的檔案,在同一路徑建立一個空檔案,常常就能顯示它先前的紀錄。在JetBrains系列IDE中,於專案資料夾按右鍵,開啟Local History中的Show History,已刪除的檔案會列在其中並可還原。
掃描磁碟尋找資料夾
在隨身碟上執行免安裝版FileFix Ultimate,開啟已刪除檔案復原,選擇磁碟並開始平衡掃描。在資料夾樹中找到專案路徑,或以cs、py、js、ts、java等副檔名篩選。相依套件與建置資料夾可以重新產生,略過即可。
儲存到別處並驗證程式碼
把救回的資料夾儲存到另一顆實體磁碟。在新位置開啟,執行建置與測試,並用git diff與遠端比較,因為部分被覆蓋的檔案乍看之下也可能顯得正常。
為什麼git通常比磁碟掃描更好
.git資料夾以壓縮形式保存了所有被追蹤檔案的每一個已提交版本。只要它還在,不論在本機或遠端,已提交的程式碼就沒有真正遺失,用對指令即可還原。這也是為什麼刪除包含.git的整個專案資料夾比刪掉幾個檔案更嚴重:如果沒有推送,歷程也一起消失了。
未提交的變更就不同了。git從未看過它們,所以實際的來源是編輯器本機歷程、編輯器為未儲存分頁所做的備份,以及磁碟本身。FileFix Ultimate的未儲存檔案尋找功能也會搜尋VS Code與Notepad++的備份副本,其中可能留有編輯器關閉時仍開著的分頁中的程式碼。
復原掃描對原始碼檔能做什麼、不能做什麼
相片與文件以可辨識的檔頭開始,即使檔案系統已忘了它們,特徵搜尋也能找到。原始碼是沒有這種檔頭的純文字。程式碼能否救回取決於檔案系統記錄:被刪資料夾的NTFS項目還在時,名稱、路徑與資料夾結構會一起回來;項目被重新使用後,文字檔基本上就找不到了。
在NTFS上,很小的檔案常直接存放在檔案記錄內部,所以有時大檔案不見了,短小的設定檔與原始碼檔卻還在。專案裡的影像、壓縮檔、SQLite資料庫等二進位檔仍可依特徵找到,但沒有名稱。
WSL或虛擬機器中的專案
放在WSL 2中的程式碼位於一個通常名為ext4.vhdx的虛擬磁碟檔中,裡面是ext4檔案系統。先執行wsl --shutdown,把這個檔案複製到另一顆磁碟,再開啟副本;FileFix Ultimate可以開啟VHDX映像並以唯讀方式讀取ext4。在ext4中刪除的檔案比在NTFS中更難連同名稱救回,請把它當作一次機會,而不是可靠的途徑。虛擬機器的VMDK、VHDX與QCOW2磁碟也能以同樣方法開啟。
無法救回的情況
- 大多數開發用電腦使用啟用TRIM的固態硬碟,刪除的檔案幾乎會立即被抹除,未提交的程式碼可能就此無法找回。
- 如果刪除之後在同一顆磁碟上安裝了套件或進行了建置,可用空間很可能已被重新使用。
- 沒有殘留的檔案系統記錄時,純文字原始碼檔無法透過特徵找到。
- 從未提交、推送,也沒有被編輯器歷程記下的工作,一旦磁碟空間被覆蓋就沒有可還原的副本。
FileFix Ultimate能幫你什麼
- 個人使用免費且沒有復原限制,提供可從隨身碟執行的免安裝版,不會對開發用磁碟寫入新資料。
- 從NTFS、FAT32與exFAT記錄重建被刪除的資料夾樹,記錄尚存時保留檔名與路徑。
- 透過未儲存檔案尋找功能找到未儲存編輯器分頁的VS Code與Notepad++備份。
- 可開啟VHDX、VMDK與QCOW2映像並以唯讀方式讀取ext4,適用於放在WSL或虛擬機器中的程式碼。
FileFix Ultimate 個人使用免費、可離線使用,且絕不會寫入你正在復原來源的磁碟機。工作或商業用途需為每台電腦購買一年期授權。執行前請先檢查簽章。
常見問題
我執行了git reset --hard,提交還能找回嗎?
通常可以。執行git reflog,找到重設之前的提交,在上面建立分支或重設回去。從未提交的變更不在reflog裡,只有暫存過的可能用git fsck找到。
git clean刪除的檔案會進資源回收筒嗎?
不會。git clean直接刪除未追蹤的檔案,所以資源回收筒裡看不到它們。剩下的辦法是編輯器本機歷程或磁碟掃描。
node_modules與建置資料夾也要救回嗎?
不需要。它們可以依專案檔與鎖定檔重新產生,原始碼救回後重新安裝更快也更安全。不救回它們還能讓結果更小,檢查起來更快。
救回的檔案會保留原本的名稱與資料夾嗎?
透過檔案系統記錄找到的會保留。原始碼檔沒有其他方式能找到,所以只要出現在資料夾樹中,通常就帶著原本的名稱。