Как вернуть удалённый файл

Обновлено 31 июля 2026 г.

Куда делся файл и как его достать - зависит от того, на каком шаге он пропал. Три случая, от простого к тяжёлому: удаление ещё в рабочем каталоге, удаление уже в коммите, коммит с файлом снесён через reset --hard. Начни с того, что ближе к твоей ситуации.

Файл удалён, но последний коммит цел

Ты стёр файл в рабочем каталоге, а git rm или коммит ещё не делал. Значит, версия из последнего коммита на месте.

$ rm report.txt
$ git status --short
 D report.txt

Одна буква D во втором столбце - «файла нет в рабочем каталоге, но git о нём помнит». Возвращает его git restore:

$ git restore report.txt

Ни вопроса, ни вывода - файл снова на диске, git status чист. Источник по умолчанию тут индекс, а он совпадает с последним коммитом, потому что ты ничего не откладывал.

Удаление уже закоммичено

Файл удалён через git rm, и удаление ушло в коммит: в git log последний коммит про удаление, а самого файла в нём уже нет.

$ git log --oneline
7c2f9a3 убрал черновик отчёта
2b90f14 добавил раздел про найм
00ef0ff первая версия отчёта

Файл жив в предыдущем коммите. Достань его версию флагом --source:

$ git restore --source=HEAD~1 report.txt
$ git status --short
?? report.txt

Файл вернулся на диск, но git пока считает его новым: restore без --staged трогает только рабочий каталог. git add report.txt и коммит запишут его в историю заново. Старая запись того же - через git checkout: git checkout HEAD~1 -- report.txt достаёт файл и сразу кладёт в индекс. Вместо HEAD~1 можно поставить хеш любого коммита, где файл ещё был: git checkout 2b90f14 -- report.txt.

Коммит с файлом снесли через reset --hard

Хуже всего, когда файл жил в коммите, а сам коммит пропал из истории после git reset --hard. В git log его нет, но хеш остался в журнале git reflog:

$ git reflog
024f79c HEAD@{0}: reset: moving to HEAD~1
ef4b778 HEAD@{1}: commit: вернул report.txt
024f79c HEAD@{2}: commit: правки во введении

Строка HEAD@{1} - тот самый снесённый коммит. Достань из него файл по хешу:

$ git restore --source=ef4b778 report.txt

Ветку это не двигает: ты берёшь из потерянного коммита один файл, а не возвращаешь всю историю. Нужен весь коммит целиком - это git reset --hard ef4b778, но чаще хватает файла.

Частые ошибки

Файл, который ни разу не попадал в коммит, вернуть нечем. git restore --source=HEAD~1 notes.txt на такой файл ответит error: pathspec 'notes.txt' did not match any file(s) known to git. Git хранит только то, что видел хотя бы раз: проверь имя и то, что файл вообще коммитился.

Вторую ловушку легко пропустить: git restore --source кладёт файл в рабочий каталог, но не в индекс. После него git status покажет файл как неотслеживаемый, и, пока не сделаешь git add, в следующий коммит он не войдёт. «Файл на диске» и «файл в истории» - это два разных состояния.

Где это в учебнике

Отмена по уровням - в четвёртой главе, спасение через reflog - в восьмой.

Глава 4. Посмотреть, отменить, спрятать лишнее

Глава 8. Аптечка: когда что-то пошло не так