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

105

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

Колин Рамзи
источник

Ответы:

145
git show HEAD^:path/to/file

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

CB Bailey
источник
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>
pdeschen
источник
5
От имени Самуэля Слунда : Один из способов найти сумму sha1 для использования выше: git whatchanged --no-abbrevэто дает результат, аналогичный журналу git (или svn).
бесхитростный шум