Como posso verificar uma versão específica de um arquivo no Git?

87

Como posso verificar uma versão específica de um arquivo no git?

Encontrei este e-mail na lista de e-mails que dizia:

$ git checkout HEAD~43 Makefile
$ git reset Makefile

Mas eu não entendo como descobrir 'HEAD ~ 43', se eu fizer um git log aFile, como posso descobrir qual 'HEAD ~ 43' devo usar?

E por que preciso executar git resetpara esse arquivo? O que isso faz?

n179911
fonte
"git reset <commit> <file>" faz exatamente o mesmo que "git checkout <commit> <file>".
Jakub Narębski
2
Se sua pergunta for sobre a sintaxe HEAD ~ 43 (documentada em git-rev-parse), pergunte sobre este problema, não sobre um não relacionado para o qual você sabe a resposta. "O que significa HEAD ~ 45 e como encontrar uma versão específica do arquivo"
Jakub Narębski
de acordo com lt.kernel.org/pub/software/scm/git/docs/v1.6.0.6/… e lt.kernel.org/pub/software/scm/git/docs/v1.6.0.6/git- reset.html , "git reset <commit> <file>" não faz exatamente o mesmo que "git checkout <commit> <file>": "git reset <commit> <file>" reverte <file> no índice de <commit> sem tocar em <file> na árvore de trabalho, mas "git checkout <commit> <file>" atualiza o índice para <file> de <commit> e, em seguida, atualiza <file> na árvore de trabalho.
yoda
2
Se alguma das respostas abaixo respondeu à sua pergunta, da maneira como o Stack Overflow funciona, você "aceitaria" a resposta clicando na marca de seleção ao lado dela; detalhes aqui . Mas apenas se sua pergunta for respondida; se não, considere adicionar mais detalhes à pergunta e / ou comentários nas respostas dizendo o que não está claro (ainda).
TJ Crowder

Respostas:

104

Você sabe a qual commit (isto é: a revisão específica) o arquivo pertence? Então faça:

git checkout <commit> <file>

O outro comando:

git checkout HEAD~N <file>

É para quando você deseja obter uma versão do arquivo de um intervalo atrás (o que eu faço por nostalgia).

Fake Code Monkey Rashid
fonte
19

HEAD~43é apenas arborizado, então você pode usar um hash ou uma tag. Você tem que separar treeish do nome do arquivo com --, caso contrário, ele será tratado como nome do arquivo. Por exemplo.

git checkout v0.45 -- filename
git checkout HEAD^ -- filename
git checkout 16bb1a4eeaa9 -- filename
dhill
fonte
2

HEAD~43refere-se ao commit (versão) do arquivo. Em vez disso, você pode usar o hash de confirmação que obtém ao fazer git logno arquivo. Se você deseja apenas o arquivo, não precisa executá git reset-lo; isso só é necessário se você quiser encaminhar o arquivo para o HEAD atual.

Jim Puls
fonte