Перейти к содержимому

Git как восстановить удаленный файл

  • автор:

Как восстановить файл в 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 не так? Это же чтобы незакоммиченные изменения перетереть (если файл не удалён, а изменён).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *