Как найти удаленный файл в проект, история коммитов?

когда-то в моем проекте был файл, который я хотел бы получить.

проблема в том, что я понятия не имею, когда я удалил его и на каком пути он был.

Как я могу найти коммиты этого файла, когда он существовал?

7 ответов


если вы не знаете точный путь, вы можете использовать

git log --all --full-history -- **/thefile.*

если вы знаете путь к файлу, вы можете сделать следующее:

git log --all --full-history -- <path-to-file>

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

git show <SHA> -- <path-to-file>

или восстановить его в вашей рабочей копии, с:

git checkout <SHA>^ -- <path-to-file>

обратите внимание на символ вставки (^), который получает кассе до к одному определенному, потому что в момент <SHA> commit файл удаляется, нам нужно посмотреть на предыдущую фиксацию, чтобы получить содержимое удаленного файла


получить список удаленных файлов и скопировать полный путь к удаленным файлом

git log --diff-filter=D --summary | grep delete

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

git log --all -- FILEPATH

показать разницу удаленных файлов

git show COMMIT_ID -- FILE_PATH

помните, что вы можете написать вывод в файл с помощью > как

git show COMMIT_ID -- FILE_PATH > deleted.diff

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

чтобы восстановить файл в git, используйте следующее (обратите внимание на знак " ^ " сразу после SHA)

git checkout <SHA>^ -- /path/to/file

@Amber дал правильный ответ! Просто еще одно дополнение, если вы не знаете точный путь к файлу, вы можете использовать подстановочные знаки! Это сработало для меня.

git log --all -- **/thefile.*

Предположим, вы хотите восстановить файл с названием MyFile, но не уверены в его пути (или его расширении, если на то пошло):

предварительный просмотр.: избегайте путаницы, перейдя к корню git

нетривиальный проект может иметь несколько каталогов с похожими или одинаковыми именами.

> cd <project-root>
  1. найти полный путь

    git log --diff-filter=D --summary / grep delete | grep Файл myfile

    delete mode 100644 full/path/to/MyFile.js

full/path/to/MyFile.js путь & файл вы искали.

  1. определите все коммиты, которые повлияли на этот файл

    git log --oneline --follow -- full / path/to / MyFile.js

    bd8374c Some helpful commit message

    ba8d20e Another prior commit message affecting that file

    cfea812 The first message for a commit in which that file appeared.

  2. оформить заказ файл

если вы выберете первую из перечисленных фиксаций (последняя хронологически, здесь bd8374c), файл не будет найден, так как он был удален в этой фиксации.

> git checkout bd8374c -- full/path/to/MyFile.js

`error: pathspec 'full/path/to/MyFile.js' did not match any file(s) known to git.`

просто выберите предыдущий (добавьте курсор) commit:

> git checkout bd8374c^ -- full/path/to/MyFile.js

попробуйте использовать один из зрителей, например gitk чтобы вы могли просматривать историю, чтобы найти этот наполовину запоминающийся файл. (используйте gitk --all при необходимости для всех отраслей)


одна из вещей, которая утомительна здесь, - это получить путь к удаленному файлу, поэтому я просто записал простую команду, где dev или пользователь git могут передать имя удаленного файла и получить историю:

git log --diff-filter=D --summary | grep filename | awk '{print ; exit}' | xargs git log --all -- 

Если кто-нибудь, может улучшить команду, пожалуйста.