Как вернуть удалённый файл
Обновлено 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 - в восьмой.