Просмотр удаленного файла в Git


105

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

Ответы:


145
git show HEAD^:path/to/file

Вы можете использовать явный идентификатор фиксации или HEAD~nпросмотреть более старые версии, или если с тех пор, как вы ее удалили, было более одной фиксации.


6
Обратите внимание, что path/to/fileэто полный путь от начала проекта (верхний каталог репозитория).
— Якуб Наребски,

1
У меня есть fatal: Invalid object name 'HEAD^'.(я должен упомянуть, что у меня только "Initial commit")
— vladkras

1
Если удаление является поэтапным, но не зафиксировано, используйте HEAD вместо HEAD ^ (поскольку он существовал в HEAD). Например, я подумал, что мне нужен файл, поэтому добавил его и обещал сохранить свою работу, а затем удалил его, когда придумал другое решение. Чтобы увидеть исходный файл перед повторной
— Тони Уикхэм

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

51

Если это файл, который вы удалили некоторое время назад и не хотите искать ревизию , вы можете использовать (файл назван fooв этом примере; вы можете использовать полный путь):

git show $(git rev-list --max-count=1 --all -- foo)^:foo

В rev-listПризыва выглядит для всех редакций , fooно только списки одного. Поскольку rev-listсписки ведутся в обратном хронологическом порядке, то в нем указывается последняя измененная ревизия, fooто есть удаленная фиксация foo. (Это основано на предположении, что git не позволяет изменять удаленный файл и при этом оставаться удаленным.) Вы не можете просто использовать ревизию, которая rev-listвозвращается как есть, потому что там fooбольше не существует. Вы должны запросить тот, который находится непосредственно перед ним, который содержит последнюю версию файла, следовательно, файл ^in git show.


2
Возможно, вам придется изменить последний foo на ./foo. А для тех, кто не использует bash, получите идентификатор с помощью "git rev-list --max-count = 1 --all - foo", а затем выполните "git show 5824127a8d99576632a04ac2b5c2344bcf751967: ./ foo" с идентификатором (524 .. is the id)
— Dror

1
Хороший ответ. Мне пришлось использовать ~ вместо ^. Не знаю почему. И для того, чтобы люди поняли это, "foo" здесь должен быть полным путем от корня git.
— pedorro 09

Вы можете написать, **/fooесли не знаете путь (это будет работать для команды rev-list, но не для команды show. Однако с фиксацией из команды rev-list вы можете найти путь).
— Николай

10

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

 git cat-file -p <sha1>

5
От имени Самуэля Слунда : Один из способов найти сумму sha1 для использования выше: git whatchanged --no-abbrevэто дает результат, аналогичный журналу git (или svn).
— бесхитростный шум
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.