Как я могу проверить конкретную версию одного файла в Git?

87

Как я могу проверить конкретную версию одного файла в git?

Я нашел это письмо в списке рассылки , в котором говорилось:

$ git checkout HEAD~43 Makefile
$ git reset Makefile

Но я не понимаю, как узнать «HEAD ~ 43», если я сделаю git log aFile, как я могу узнать, какой «HEAD ~ 43» мне следует использовать?

И зачем мне запускать git resetэтот файл? Что оно делает?

n179911
источник
«git reset <commit> <file>» делает то же самое, что и «git checkout <commit> <file>».
Якуб Наребски
2
Если ваш вопрос касается синтаксиса HEAD ~ 43 (задокументирован в git-rev-parse), спрашивайте об этой проблеме, а не о несвязанной, на которую вы знаете ответ. «Что означает HEAD ~ 45 и как найти конкретную версию файла»
Якуб Наребски
согласно lt.kernel.org/pub/software/scm/git/docs/v1.6.0.6/… и lt.kernel.org/pub/software/scm/git/docs/v1.6.0.6/git- reset.html , «git reset <commit> <file>» не делает то же самое, что «git checkout <commit> <file>»: «git reset <commit> <file>» возвращает <file> в индекс из <commit>, не касаясь <file> в рабочем дереве, но "git checkout <commit> <file>" обновляет индекс для <file> из <commit>, а затем обновляет <file> в рабочем дереве.
yoda
2
Если какой-либо из приведенных ниже ответов дает ответ на ваш вопрос, как работает Stack Overflow, вы должны «принять» ответ, нажав на галочку рядом с ним; подробности здесь . Но только если на ваш вопрос ответят; если нет, рассмотрите возможность добавления дополнительных деталей к вопросу и / или комментариев к ответам, в которых говорится, что не ясно (пока).
TJ Crowder

Ответы:

104

Вы знаете, к какому коммиту (т.е. к конкретной ревизии) принадлежит файл? Затем сделайте:

git checkout <commit> <file>

Другая команда:

git checkout HEAD~N <file>

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

Поддельный код обезьяны Рашид
источник
19

HEAD~43просто древовидный, поэтому вы можете использовать хэш или тег. Вы должны отделить древовидность от имени файла с помощью --, иначе оно будет рассматриваться как имя файла. Например.

git checkout v0.45 -- filename
git checkout HEAD^ -- filename
git checkout 16bb1a4eeaa9 -- filename
укроп
источник
2

HEAD~43относится к фиксации (версии) файла. Вместо этого вы можете использовать хэш фиксации, который вы получаете в результате выполнения git logв файле. Если вам просто нужен файл, запускать git resetего не нужно ; это необходимо только в том случае, если вы хотите перенаправить файл на текущий HEAD.

Джим Пульс
источник