Что сделать прямо сейчас
- Проверьте корзину, а если проект был отправлен на сервер, клонируйте репозиторий заново.
- Если папка .git уцелела, верните файлы и коммиты командами git restore, git reflog и git stash.
- Для незакоммиченной работы проверьте Временную шкалу VS Code или Local History в 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 откройте Временную шкалу файла: локальная история хранится отдельно от проекта. Для удалённого файла часто достаточно создать пустой файл по тому же пути, чтобы появились прежние записи. В IDE от JetBrains щёлкните правой кнопкой по папке проекта и откройте 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 виртуальных машин открываются так же.
Когда это не сработает
- Большинство рабочих машин разработчиков использует SSD с 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 и папки сборки?
Нет. Они создаются заново из файлов проекта и файла блокировки, поэтому быстрее и безопаснее переустановить их, когда исходники вернутся. Без них восстановление к тому же меньше и проверяется быстрее.
Сохранят ли восстановленные файлы имена и папки?
Если они найдены по записям файловой системы, да. Исходники нельзя найти иначе, поэтому файл, который вообще появился в дереве папок, обычно появляется со своим именем.