Найдите последнюю фиксацию, которая повлияла на данный путь. Поскольку файла нет в фиксации 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"
Найдите фиксацию, которая удалила Ваш файл:
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
команда, где искать файл (файлы) для восстановления, и это может быть любая фиксация и даже индекс.
У меня также есть эта проблема с помощью ниже кода, получают предыдущий файл к локальному каталогу
git checkout <file path with name>
ниже примера, работающего на меня
git checkout resources/views/usaSchools.blade.php
Спасибо
Если вы безумен, используйте 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 .
git log --diff-filter = D --summary
, чтобы получить все коммиты, которые удалили файлы и файлы удалены; git checkout $ commit ~ 1 путь / к / file.ext
для восстановления удаленного файла. Где $ commit
- значение фиксации, найденной на шаге 1, например e4cf499627