¿Cómo puedo verificar una versión particular de un archivo en Git?

87

¿Cómo puedo verificar una versión particular de un archivo en git?

Encontré este correo en la lista de correo , que decía:

$ git checkout HEAD~43 Makefile
$ git reset Makefile

Pero no entiendo cómo averiguar 'HEAD ~ 43', si hago una git log aFile, ¿cómo puedo saber qué 'HEAD ~ 43' debo usar?

¿Y por qué necesito ejecutar git resetese archivo? ¿Qué hace?

n179911
fuente
"git reset <commit> <file>" hace exactamente lo mismo que "git checkout <commit> <file>".
Jakub Narębski
2
Si su pregunta es sobre la sintaxis HEAD ~ 43 (documentada en git-rev-parse), pregunte sobre este problema, no sobre uno no relacionado con el que conozca la respuesta. "¿Qué significa HEAD ~ 45 y cómo encontrar una versión particular del archivo?"
Jakub Narębski
según lt.kernel.org/pub/software/scm/git/docs/v1.6.0.6/… y lt.kernel.org/pub/software/scm/git/docs/v1.6.0.6/git- reset.html , "git reset <commit> <file>" no hace exactamente lo mismo que "git checkout <commit> <file>": "git reset <commit> <file>" revierte <file> en el índice desde <commit> sin tocar <file> en el árbol de trabajo, pero "git checkout <commit> <file>" actualiza el índice para <file> desde <commit> y luego actualiza <file> en el árbol de trabajo.
yoda
2
Si alguna de las respuestas a continuación respondió a su pregunta, la forma en que funciona Stack Overflow, "aceptará" la respuesta haciendo clic en la marca de verificación junto a ella; detalles aquí . Pero solo si su pregunta es respondida; si no es así, considere agregar más detalles a la pregunta y / o comentarios sobre las respuestas diciendo lo que no está claro (todavía).
TJ Crowder

Respuestas:

104

¿Sabes a qué confirmación (es decir, la revisión específica) pertenece el archivo? Entonces hazlo:

git checkout <commit> <file>

El otro comando:

git checkout HEAD~N <file>

Es para cuando quieres obtener una versión del archivo de un rango atrás (lo que hago por nostalgia).

Código falso Monkey Rashid
fuente
19

HEAD~43es simplemente arbóreo, por lo que puede usar un hash o una etiqueta. Debe separar treeish del nombre de archivo con --, de lo contrario, se trata como nombre de archivo. Por ejemplo.

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

HEAD~43se refiere a la confirmación (versión) del archivo. En lugar de eso, puede usar el hash de confirmación que obtiene al hacer git logen el archivo. Si solo desea el archivo, no necesita ejecutarlo git reset; eso solo es necesario si desea transferir el archivo al HEAD actual.

Jim Puls
fuente