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>
full/path/to/MyFile.js
- это путь и файл, который вы ищете.
-
Определить все коммиты, которые повлияли на этот файл
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.
-
Оформить заказ
Если вы выберете фиксацию с первым номером (последний хронологически, здесь 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
Вы ищете полный путь к файлу в истории удаленных файлов git log --diff-filter=D --summary | grep filename
- Шаг 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