Если файл исчез из проекта на Mac до того, как вы успели его закоммитить, сначала проверьте Корзину Mac, а также Time Machine или облачные сервисы восстановления. Затем проверьте Git: он может восстановить удаленный файл, если эта версия есть в индексе или коммите, а также может найти содержимое, сохраненное как недостижимый объект. Если файл существовал только как несохраненное или непроиндексированное содержимое рабочей копии, у Git может не оказаться его копии. Выполните эти проверки перед созданием новых файлов в проекте.
1. Проверьте Корзину и выполните поиск по Mac
Откройте Корзину из Dock и найдите файл по имени. Если вы найдете его, нажмите на него, удерживая клавишу Control, и выберите Возвратить, чтобы вернуть его на прежнее место, либо перетащите его в безопасную папку. Apple также рекомендует использовать поиск Spotlight, если файл мог быть перемещен или переименован. Для папки проекта в iCloud Drive проверьте не только Корзину, но и раздел «Недавно удаленные» или параметры восстановления данных в iCloud; по заявлению Apple, подлежащие восстановлению удаленные файлы iCloud Drive обычно можно вернуть в течение 30 дней. Инструкции Apple по восстановлению данных в iCloud
Если инструмент разработчика удалил файл напрямую минуя корзину или же Корзина уже была очищена, переходите к следующему шагу. Не стоит полагать, что любое удаление обязательно проходит через Корзину.
2. Проверьте Time Machine, включая локальные снимки
Если Time Machine была включена, подключите диск резервного копирования, если он доступен. В Finder откройте папку, в которой ранее находился файл, с помощью Spotlight откройте Time Machine, затем перемещайтесь по временной шкале или стрелкам резервных копий к дате до момента удаления. Выберите файл и нажмите Восстановить. Apple отмечает, что восстановленные объекты возвращаются в их исходное расположение, поэтому имеет смысл восстановить файл в отдельное место, если вы хотите сравнить версии перед перезаписью. Руководство Apple по восстановлению объектов из Time Machine
Отключенный резервный диск не исключает возможность восстановления. Time Machine может использовать локальные снимки (снапшоты), хранящиеся на самом Mac, однако они временные: Apple сообщает, что снимки обычно создаются каждый час и хранятся в течение 24 часов, при этом создание дополнительных снимков зависит от наличия свободного места. Они существуют только тогда, когда используется Time Machine, и не заменяют собой полноценное внешнее резервное копирование. О локальных снимках Time Machine
3. Восстановите отслеживаемый файл из Git
Откройте Терминал, перейдите в каталог проекта и проверьте статус файла перед выполнением любых операций восстановления:
git status --short
Если удаленный путь отображается и файл отслеживался, восстановите его из индекса, указав относительный путь внутри проекта:
git restore -- path/to/file.ext
Эта команда скопирует проиндексированную версию в рабочее дерево. Если файл не был проиндексирован, но присутствует в последнем коммите, восстановите его из HEAD:
git restore --source=HEAD -- path/to/file.ext
Разница принципиальна: по умолчанию git restore берет версию из индекса для восстановления в рабочем дереве; флаг --source=HEAD явно выбирает последний коммит. Восстановление перезаписывает указанный путь в рабочем дереве выбранной версией, поэтому предварительно сохраните отдельную копию любого находящегося там файла, если его текущее содержимое имеет значение. Git подробно описывает эти источники и алгоритмы восстановления в руководстве по git restore.
Эти команды не могут восстановить совершенно новый неотслеживаемый файл или изменения, которые ни разу не индексировались и не коммитились. Git знает только о тех версиях, которые попали в его индекс, коммиты или базу данных объектов.
4. Поищите в недостижимых объектах Git в качестве крайнего средства
Иногда Git сохраняет содержимое файла, даже если на него не указывает ни одна ветка или коммит — например, версию, которая была проиндексирована, а затем удалена из индекса. Из каталога проекта выполните проверку недостижимых объектов:
git fsck --unreachable
Git может вывести сообщение о недостижимом объекте blob, за которым следует идентификатор объекта (ID). Чтобы просмотреть потенциального кандидата, не внося изменений в проект, выполните:
git cat-file -p OBJECT_ID
Замените OBJECT_ID на полученный идентификатор. Если на экране отобразилось содержимое нужного файла, перенаправьте вывод во временную копию вне проекта, например:
git cat-file -p OBJECT_ID > "$HOME/Desktop/recovered-file.txt"
Имя файла и расширение приведены здесь в качестве примера; выберите подходящий путь и имя для вашего файла. Объекты Git (blob) хранят только содержимое, но не исходный путь, поэтому вам может потребоваться вручную просмотреть найденных кандидатов и определить правильное имя. Команда git fsck находит недостижимые объекты, а ее параметр --lost-found может записать содержимое blob-объектов в директорию .git/lost-found/other/; при этом ни один из методов не гарантирует нахождение нужной версии. Документация Git по git fsck
Если файла нет ни в одном источнике восстановления
Если файл отсутствует в Корзине, резервных копиях, облачных службах восстановления, индексе Git, коммитах и недостижимых объектах Git, возможно, его копию нельзя вернуть с помощью описанных штатных средств. В частности, неотслеживаемый файл, который никогда не добавлялся в индекс, находится за пределами сохраненной истории Git. Проверьте локальную историю вашего редактора кода (Local History) или другой сервис резервного копирования, если вы им пользовались; доступность и порядок действий зависят от конкретного продукта. Пока идет поиск, не вносите лишних изменений в проект, а любое восстановленное содержимое сохраняйте под новым именем до тех пор, пока не убедитесь, что это именно та версия, которая вам нужна.
Источники
- Если в iCloud Drive отсутствуют файлы — Служба поддержки Apple
- Восстановление объектов, резервные копии которых созданы с помощью Time Machine на Mac — Служба поддержки Apple
- О локальных снимках Time Machine — Служба поддержки Apple
- git restore — Git
- git fsck — Git