Найти и восстановить удаленный файл в репозитории Git - PullRequest
2618 голосов
/ 05 июня 2009

Скажи, что я в Git-репозитории. Я удаляю файл и фиксирую это изменение. Я продолжаю работать и делаю еще коммиты. Затем я обнаружил, что мне нужно восстановить этот файл.

Я знаю, что могу извлечь файл, используя git checkout HEAD^ foo.bar, но я не знаю, когда этот файл был удален.

  1. Какой самый быстрый способ найти коммит, который удалил данное имя файла?
  2. Какой самый простой способ вернуть этот файл в мою рабочую копию?

Я надеюсь, что мне не придется вручную просматривать мои журналы, извлекать весь проект для данного SHA, а затем вручную копировать этот файл в исходную проверку моего проекта.

Ответы [ 22 ]

15 голосов
/ 25 июня 2013
git checkout /path/to/deleted.file
11 голосов
/ 22 октября 2012

Во многих случаях может быть полезно использовать coreutils (grep, sed и т. Д.) В сочетании с Git. Я уже хорошо знаю эти инструменты, но Git меньше. Если бы я хотел выполнить поиск удаленного файла, я бы сделал следующее:

git log --raw | grep -B 30 $'D\t.*deleted_file.c'

Когда я нахожу ревизию / коммит:

git checkout <rev>^ -- path/to/refound/deleted_file.c

Точно так же, как другие заявили до меня.

Файл теперь будет восстановлен до состояния, в котором он находился до удаления. Не забудьте повторно зафиксировать его в рабочем дереве, если хотите сохранить его вокруг.

10 голосов
/ 08 июня 2017

git undelete path/to/file.ext

  1. Поместите это в ваш .bash_profile (или другой соответствующий файл, который загружается при открытии командной оболочки):

    git config --global alias.undelete '!sh -c "git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1" -'
    
  2. Тогда используйте:

    git undelete path/to/file.ext
    

Этот псевдоним сначала проверяет, чтобы найти последний коммит, где существовал этот файл, затем выполняет git извлечение пути этого файла из того последнего коммита, где этот файл существовал. источник

7 голосов
/ 30 ноября 2013

Таким образом, мне пришлось восстановить кучу удаленных файлов из определенного коммита, и я справился с этим двумя командами:

git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git checkout <rev>^ -- 
git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git reset HEAD 

(обратите внимание на завершающий пробел в конце каждой команды.)

Файлы были добавлены в файл .gitignore и затем очищены с помощью git rm. Мне нужно было восстановить файлы, но затем удалить их. Мне нужно было восстановить сотни файлов, набирать вещи вручную для каждого файла, как в других примерах, было бы слишком медленно.

5 голосов
/ 04 января 2018

У меня был тот же вопрос. Не зная этого, я создал висячий коммит .

Список свисающих коммитов

git fsck --lost-found

Проверять каждый висячий коммит

git reset --hard <commit id>

Мои файлы снова появились, когда я перешел на висячий коммит.

git status по причине:

“HEAD detached from <commit id where it detached>”

5 голосов
/ 24 ноября 2018

На самом деле, этот вопрос напрямую касается Git, но кто-то вроде меня работает с инструментами графического интерфейса, такими как WebStorm VCS, кроме знания команд git cli.

Я щелкаю правой кнопкой мыши путь, содержащий удаленный файл, затем перехожу на Git и затем нажимаю Show History.

enter image description here

Инструменты VCS показывают все ревизии, и я вижу все коммиты и изменения каждого из них.

enter image description here

Затем я выбираю коммиты, которые мой друг удаляет файл PostAd.js. теперь смотрите ниже:

enter image description here

И теперь я вижу, как мое желание удалить удаленный файл. Я просто дважды щелкаю по имени файла, и оно восстанавливается.

enter image description here

Я знаю, что мой ответ не Git команды, но это быстро, надежно и легко для начинающих и профессиональных разработчиков. Webstorm Инструменты VCS великолепны и идеально подходят для работы с Git и не нуждаются ни в каком другом плагине или инструментах.

5 голосов
/ 29 ноября 2012
user@bsd:~/work/git$ rm slides.tex
user@bsd:~/work/git$ git pull 
Already up-to-date.
user@bsd:~/work/git$ ls slides.tex
ls: slides.tex: No such file or directory

Восстановить удаленный файл:

user@bsd:~/work/git$ git checkout
D       .slides.tex.swp
D       slides.tex
user@bsd:~/work/git$ git checkout slides.tex 
user@bsd:~/work/git$ ls slides.tex
slides.tex
4 голосов
/ 03 июля 2012

В нашем случае мы случайно удалили файлы в коммите, а некоторые из них позже осознали нашу ошибку и хотели получить обратно все файлы, которые были удалены, но не те, которые были изменены.

Основываясь на превосходном ответе Чарльза Бейли, вот мой единственный вкладыш:

git co $(git rev-list -n 1 HEAD -- <file_path>)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- <file_path>)~1 head | grep '^D' | cut -f 2)
4 голосов
/ 03 декабря 2015

Если вы знаете коммит, который удалил файл (ы), выполните эту команду, где <SHA1_deletion> - коммит, который удалил файл:

git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --

Часть перед конвейером перечисляет все файлы, которые были удалены в коммите; все они извлечены из предыдущего коммита для их восстановления.

2 голосов
/ 26 октября 2018

Просто и точно-

Прежде всего, получите последний стабильный коммит, в котором у вас есть этот файл, -

git log 

Скажем, вы нашли $ commitid 1234567 ..., затем

git checkout <$commitid> $fileName

Это восстановит версию файла, которая была в этом коммите.

...