Найти и восстановить удаленный файл в репозитории Git

2665
задан 7ochem 24 February 2016 в 11:31
поделиться

5 ответов

Найдите последнюю фиксацию, которая повлияла на данный путь. Поскольку файла нет в фиксации HEAD, эта фиксация должна была удалить его.

git rev-list -n 1 HEAD -- <file_path>

Затем проверьте версию перед фиксацией, используя символ вставки ( ^ ):

git checkout <deleting_commit>^ -- <file_path>

Или в одной команде, если $ file - это файл, о котором идет речь.

git checkout $(git rev-list -n 1 HEAD -- "$file")^ -- "$file"

Если вы используете zsh и у вас включена опция EXTENDED_GLOB, символ каретки не будет работать. Вместо этого можно использовать ~ 1 .

git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"
3050
ответ дан 22 November 2019 в 19:51
поделиться

Найдите фиксацию, которая удалила Ваш файл:

git log --diff-filter=D --oneline -- path/to/file | cut -f -d ' '

Демонстрационный вывод:

4711174

С Мерзавца 2.23 существует на самом деле restore команда. Это все еще экспериментально , но для восстановления чего-то, что Вы удалили в фиксации (4711174 в этом случае), можно тогда ввести:

git restore --source=4711174^ path/to/file

Примечание ^ после идентификатора фиксации, поскольку мы хотим восстановить что-то от фиксации прежде та, которая удалила файл.

--source аргумент говорит эти restore команда, где искать файл (файлы) для восстановления, и это может быть любая фиксация и даже индекс.

См.: документ восстановления мерзавца для мерзавца 2.23.0

2
ответ дан cb2 14 September 2019 в 15:57
поделиться
  • 1
    Эти работы также, но я нашел другой тривиальный ответ. Спасибо – yalkris 22 January 2013 в 23:36

У меня также есть эта проблема с помощью ниже кода, получают предыдущий файл к локальному каталогу

git checkout <file path with name>

ниже примера, работающего на меня

git checkout resources/views/usaSchools.blade.php

Спасибо

-1
ответ дан 22 November 2019 в 19:51
поделиться

Если вы безумен, используйте git-bisect . Вот что нужно делать:

git bisect start
git bisect bad
git bisect good <some commit where you know the file existed>

Теперь пора запустить автоматический тест. Команда оболочки '[-e foo.bar]' вернет 0, если существует foo.bar , и 1 в противном случае. Команда «запустить» git-bisect будет использовать двоичный поиск для автоматического поиска первой фиксации, при которой тест не прошел. Он начинается с середины указанного диапазона (от хорошего до плохого) и сокращает его пополам в зависимости от результата указанного теста.

git bisect run '[ -e foo.bar ]'

Теперь вы находитесь в коммите, который его удалил. Отсюда вы можете вернуться в будущее и использовать git-revert , чтобы отменить изменение,

git bisect reset
git revert <the offending commit>

или вернуться на один коммит и вручную проверить повреждения:

git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .
93
ответ дан 22 November 2019 в 19:51
поделиться
  1. Используйте git log --diff-filter = D --summary , чтобы получить все коммиты, которые удалили файлы и файлы удалены;
  2. Используйте git checkout $ commit ~ 1 путь / к / file.ext для восстановления удаленного файла.

Где $ commit - значение фиксации, найденной на шаге 1, например e4cf499627

833
ответ дан 22 November 2019 в 19:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: