Việc cần làm ngay bây giờ
- Xem Thùng rác, rồi clone lại kho nếu dự án đã được đẩy lên máy chủ.
- Nếu thư mục .git còn, dùng git restore, git reflog và git stash để lấy lại file và commit.
- Với phần việc chưa commit, hãy xem Timeline của VS Code hoặc Local History của JetBrains trước khi quét ổ từ USB.
Từng bước
Dừng build và xem Thùng rác
Đừng cài gói, build hay chạy test trên ổ đó, vì chúng ghi hàng nghìn file. Xem Thùng rác trước: file xóa từ File Explorer hoặc nhiều IDE thường vào đó, còn các lệnh như rm -rf, del, Remove-Item hay git clean thì bỏ qua Thùng rác.
Clone lại từ kho từ xa
Nếu dự án đã được đẩy lên GitHub, GitLab hay máy chủ khác, hãy clone lại vào một thư mục mới. Mọi thứ đã commit và push sẽ trở lại nguyên vẹn. Chỉ còn thiếu phần việc cục bộ chưa từng được đẩy lên.
Dùng git nếu thư mục .git còn
Nếu chỉ một số file bị xóa, git status sẽ liệt kê chúng và git restore kèm đường dẫn thường đưa về phiên bản commit gần nhất. Sau khi lỡ chạy git reset --hard, git reflog cho thấy các commit trước đó để quay lại. Kiểm tra git stash list xem có phần việc cất tạm không. File đã git add nhưng chưa commit đôi khi tìm được bằng git fsck --lost-found.
Xem lịch sử cục bộ của trình soạn thảo
Trong VS Code, mở chế độ xem Timeline của file; lịch sử cục bộ được lưu tách khỏi dự án. Với file đã xóa, tạo một file rỗng cùng đường dẫn thường làm các mục cũ hiện ra. Trong IDE của JetBrains, nhấp chuột phải vào thư mục dự án, mở Local History rồi Show History, nơi các file đã xóa được liệt kê và có thể hoàn nguyên.
Quét ổ đĩa tìm thư mục
Chạy bản di động FileFix Ultimate từ USB, mở Khôi phục tệp đã xóa, chọn ổ và bắt đầu Quét cân bằng. Duyệt cây thư mục tới đường dẫn dự án, hoặc lọc theo phần mở rộng như cs, py, js, ts hay java. Bỏ qua thư mục phụ thuộc và thư mục build vì có thể tạo lại.
Lưu sang nơi khác và kiểm tra mã
Lưu thư mục đã khôi phục sang một ổ đĩa vật lý khác. Mở ở vị trí mới, chạy build và test, rồi so sánh với kho từ xa bằng git diff, vì file bị ghi đè một phần thoạt nhìn vẫn có thể trông bình thường.
Vì sao git thường tốt hơn quét ổ đĩa
Thư mục .git chứa, ở dạng nén, mọi phiên bản đã commit của từng file được theo dõi. Chừng nào nó còn tồn tại ở máy hay trên máy chủ, mã đã commit chưa thật sự mất, chỉ cần đúng lệnh. Cũng vì vậy, xóa cả thư mục dự án chứa .git tệ hơn xóa vài file, vì lịch sử mất theo nếu chưa push.
Thay đổi chưa commit thì khác. Git chưa từng thấy chúng, nên nguồn thực tế là lịch sử cục bộ của trình soạn thảo, bản sao lưu tab chưa lưu và chính ổ đĩa. Chức năng tìm tệp chưa lưu của FileFix Ultimate cũng tìm bản sao lưu của VS Code và Notepad++, nơi có thể còn mã của các tab đang mở khi trình soạn thảo bị đóng.
Quét khôi phục làm được và không làm được gì với mã nguồn
Ảnh và tài liệu bắt đầu bằng phần đầu dễ nhận ra, nên tìm theo chữ ký vẫn thấy chúng dù hệ thống tệp đã quên. Mã nguồn là văn bản thuần không có phần đầu như vậy. Với mã, mọi thứ phụ thuộc vào bản ghi hệ thống tệp: nếu mục NTFS của thư mục đã xóa còn, tên, đường dẫn và cấu trúc thư mục quay lại cùng nhau; nếu đã bị dùng lại, file văn bản gần như không tìm được.
Trên NTFS, file rất nhỏ thường được lưu ngay trong bản ghi của nó, nên đôi khi file cấu hình và file mã ngắn vẫn còn khi file lớn đã mất. Tài nguyên nhị phân trong dự án như ảnh, file nén hay cơ sở dữ liệu SQLite vẫn tìm được theo chữ ký, nhưng không có tên.
Dự án nằm trong WSL hoặc máy ảo
Mã đặt trong WSL 2 nằm trong một file ổ đĩa ảo, thường tên là ext4.vhdx, chứa hệ thống tệp ext4. Chạy wsl --shutdown, sao chép file đó sang ổ khác rồi mở bản sao; FileFix Ultimate mở được ảnh VHDX và đọc ext4 ở chế độ chỉ đọc. File xóa trong ext4 khó lấy lại kèm tên hơn trên NTFS, nên hãy xem đây là một cơ hội chứ không phải con đường chắc chắn. Ổ VMDK, VHDX và QCOW2 của máy ảo cũng mở theo cách tương tự.
Khi nào không khôi phục được
- Hầu hết máy lập trình dùng SSD có TRIM, có thể xóa sạch file đã xóa gần như ngay lập tức; mã chưa commit khi đó có thể mất hẳn.
- Nếu sau khi xóa bạn đã cài gói hoặc build trên cùng ổ, vùng trống nhiều khả năng đã bị dùng lại.
- Không còn bản ghi hệ thống tệp thì file mã nguồn văn bản thuần không thể tìm theo chữ ký.
- Phần việc chưa từng commit, push hay được lịch sử trình soạn thảo ghi lại sẽ không còn bản sao nào sau khi vùng đĩa bị ghi đè.
FileFix Ultimate giúp gì
- Miễn phí cho mục đích cá nhân, không giới hạn (dùng cho công việc cần giấy phép 1 năm cho mỗi PC), có bản di động chạy từ USB nên không ghi thêm gì vào ổ lập trình.
- Dựng lại cây thư mục đã xóa từ bản ghi NTFS, FAT32 và exFAT, giữ tên file và đường dẫn khi bản ghi còn.
- Dùng chức năng tìm tệp chưa lưu để tìm bản sao lưu VS Code và Notepad++ của tab chưa lưu.
- Mở ảnh VHDX, VMDK và QCOW2 và đọc ext4 ở chế độ chỉ đọc cho mã đặt trong WSL hoặc máy ảo.
FileFix Ultimate miễn phí cho mục đích cá nhân, hoạt động ngoại tuyến và không bao giờ ghi vào ổ đĩa bạn đang khôi phục dữ liệu từ đó. Sử dụng cho công việc hoặc kinh doanh cần giấy phép 1 năm cho mỗi máy tính. Hãy kiểm tra chữ ký trước khi chạy.
Câu hỏi thường gặp
Tôi đã chạy git reset --hard. Có lấy lại commit được không?
Thường là được. Chạy git reflog, tìm commit trước lần reset rồi tạo nhánh tại đó hoặc reset về đó. Thay đổi chưa từng commit không có trong reflog; chỉ phần đã stage có thể tìm bằng git fsck.
git clean có đưa file vào Thùng rác không?
Không. git clean xóa trực tiếp các file không được theo dõi, nên chúng không xuất hiện trong Thùng rác. Chỉ còn lịch sử cục bộ của trình soạn thảo hoặc quét ổ đĩa.
Có cần khôi phục node_modules và thư mục build không?
Không. Chúng được tạo lại từ file dự án và file khóa, nên cài lại sau khi lấy lại mã nguồn sẽ nhanh và an toàn hơn. Bỏ chúng ra cũng giúp kết quả nhỏ hơn và kiểm tra nhanh hơn.
File khôi phục có giữ nguyên tên và thư mục không?
Có, khi chúng được tìm qua bản ghi hệ thống tệp. File mã nguồn không thể tìm bằng cách khác, nên file nào đã hiện trong cây thư mục thường hiện kèm tên.