Как восстановить файл в Git
Восстановление удаленного файла или отмена изменений
Ситуация: вы удалили файл и хотите его восстановить или сделали изменения в файле, которые хотите отменить. То есть необходимо вернуть файл в то состояние, в котором он находится в Git репозитории.
Если вы еще не добавили файл в индекс (не выполнили git add), то для восстановления файла можно воспользоваться командой (вместо myfile необходимо указать файл, который вы восстанавливаете):
git checkout -- myfile
Просмотреть список удаленных файлов можно командой: git ls-files —deleted
Восстановление удаленного файла, если он уже добавлен в индекс (git add)
Если вы удалили файл и уже добавили его в индекс, выполнив git add, то сначала нужно удалить его из индекса, а затем выполнить восстановление, как было показано выше. Для этого выполните команды:
git reset -- myfile git checkout -- myfile
Смотрите также:
- Как изменить файлы в старом коммите (не последнем)
- Как добавить все файлы в коммит, кроме одного
- Как создать ветку из предыдущего коммита
- Команда Git stash. Как прятать изменения в Git
- Как показать файлы, которые будут добавлены в текущий коммит
- Как изменить комментарий к коммиту
- Как отменить git add
- Как клонировать репозиторий
- Как посмотреть ветки
- Как переключиться на ветку
- Опубликовано: 12.09.2018
- yuriy
Git как восстановить удаленный файл
Сегодня передо мной встала довольно простая, но интересная задача: восстановить несколько файлов в репозитории Git, которые были удалены некоторое время назад в разных коммитах. Задача простая, потому что решение легко найти в соотвествующих ответах на Stack Overflow. Мне лишь осталось слегка адаптировать приведенные примеры команд для своих нужд.
Я не помнил точные названия файлов и уж тем более не знал хэши коммитов, в которых производилось удаление. Поэтому воспользовался сниппетом от пользователя Robert Munteanu, чтобы вывести историю удаленных файлов:
git log --diff-filter=D --summary
Отыскав необходимые файлы и коммиты, можно было бы воспользоваться простым git checkout для восстановления, но список был весьма велик, так что пришлось набросать небольшой скрипт на Bash.
#!/bin/bash set -o nounset set -o errexit declare -a files=( "source/posts/2012-11-11-twitter/Untitled.png" "source/posts/2013-06-08-wb/unnamed.png" "source/posts/2012-10-13-lift/IMG_0020.png" ); counter=0 while [ $counter -lt $files[@]> ]; do file=$files[$counter]> commit=$(git rev-list -n 1 HEAD -- "$file") echo Restoring file: $file from commit: $commit git checkout $commit^ "$file" let counter+=1 done
В скрипте я объявляю массив с нужными мне файлами (в примере я сократил список). Далее в цикле проходимся по этому списку, при помощи команды git rev-list -n 1 HEAD — «$file» находим коммит, в котором последний раз использовался этот файл и при помощи git checkout $commit^ «$file» восстанавливаем его из предыдущего коммита (для этого используется символ ^ ).
Рекомендую почитать
Свежие записи
- Переустановка старой версии macOS на Mac Mini 2011 года
- Архитектура Redux в Swift: Введение
- Хостинг статического контента в Firebase
- Внешний SSD Transcend ESD240C
- FSEvents: Разбираемся с мониторингом событий файловой системы в macOS
Git как восстановить удаленный файл
Бывает по запарке удаляешь что-то не то из рабочей папки под контролем git. Обычно чтобы просто откатить состояние файла до исходного в текущей версии (даже после ручного удаления), нужно сделать такой чекаут
git checkout -- file_name.ext
В нашем же случае удаление делалось через git rm и так просто счекаутить обратно состояние уже не получится, поскольку git же думает что мы специально файл удалили. Эта проблема возникает иногда из-за того, что умная IDE сама дописывает удаления (и добавления) файлов в git, оставляя нам только ручные коммиты и пуши. Поэтому надо сделать сначала ресет файла в индексе, а уже потом чекаут (см. git help reset)
git reset -- file_name.ext git checkout -- file_name.ext
Кстати если до коммита вы решили что какой-то файл вы добавили по ошибке (после git add но до коммита), такой же ресет поможет убрать его из следующего коммита. Для папок работает все тоже самое.
Как вернуть удаленный файл в GIT
Вопрос: Как правильно вернуть удаленный файл не откатывая commit в котором удалили файл на этапе 2? Что делать, если файлов несколько, а в ветках есть и другие изменения, который нельзя откатить полностью?
Сэмулировал ситуацию в репозитории
Отслеживать
9,411 8 8 золотых знаков 49 49 серебряных знаков 99 99 бронзовых знаков
задан 6 июл 2020 в 17:09
Vsyakikh Andrey Vsyakikh Andrey
13 1 1 серебряный знак 4 4 бронзовых знака
$ git checkout коммит-когда-файлы-ещё-были — имя-файла1 имя-файла2 .
6 июл 2020 в 18:04
Тогда улетят другие правки, сделанные в томже мердже
6 июл 2020 в 18:09
не знаю, о чём вы говорите, но приведённая выше команда сделает ровно то, о чём у вас написано в вопросе: создаст указанные файлы в том виде, как они были зафиксированы в указанном коммите.
6 июл 2020 в 18:55
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
если команде checkout передать список файлов, то она восстановит содержимое этих файлов в том виде, как они были зафиксированы в указанном коммите (если не указать ни хэш коммита, ни имя указателя — ветки или метки — то будет использован указатель HEAD ).
на случай, если имя какого-нибудь из файлов совпадает с именем какого-нибудь указателя — метки или ветки — лучше отделить их от остальных аргументов с помощью — .
для описанной в вопросе ситуации команда будет выглядеть примерно так:
$ git checkout коммит-когда-файлы-ещё-были -- имя-файла1 имя-файла2 .
Отслеживать
ответ дан 6 июл 2020 в 19:04
aleksandr barakin aleksandr barakin
67.9k 216 216 золотых знаков 77 77 серебряных знаков 219 219 бронзовых знаков
Хм.. У меня по сути такой же ответ, только про возможность указать несколько имён не вспомнил. А вот описание у нас разное)))
6 июл 2020 в 19:14
ну да, команда-то одна и та же для очень-очень разных действий. и описание к ней можно приложить разное. например, написать про какие-то «родственные ветки», или упомянуть непонятно зачем про опцию —force
6 июл 2020 в 19:32
Под родственными я имел в виду, что она не является мёрджем. А что с force не так? Это же чтобы незакоммиченные изменения перетереть (если файл не удалён, а изменён).