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

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

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

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

Ответ 1

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

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> фиксация файла удаляется, нам нужно посмотреть предыдущую фиксацию, чтобы получить удаленный файл содержание

Ответ 2

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

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

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

git log --all -- FILEPATH

Показать diff удалённого файла

git show COMMIT_ID -- FILE_PATH

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

git show COMMIT_ID -- FILE_PATH > deleted.diff

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

Prelim.: Избегайте путаницы, перейдя к корню git

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

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

    git log --diff-filter = D -summary | grep удалить | 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.`

Просто выберите предыдущую (добавьте каретку) фиксацию:

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

Резюме:

  1. Шаг 1

Вы ищете полный путь к файлу в истории удаленных файлов git log --diff-filter=D --summary | grep filename

  1. Шаг 2

Вы восстанавливаете свой файл из коммита до его удаления

restore () {
  filepath="[email protected]"
  last_commit=$(git log --all --full-history -- $filepath | grep commit | head -1 | awk '{print $2; exit}')
  echo "Restoring file from commit before $last_commit"
  git checkout $last_commit^ -- $filepath
}

restore my/file_path