Tengo un repositorio de Git y me gustaría ver cómo se veían algunos archivos hace unos meses. Encontré la revisión en esa fecha; es 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8. Necesito ver cómo se ve un archivo y también guardarlo como un archivo ("nuevo").
Logré ver el archivo usando gitk, pero no tiene una opción para guardarlo. Lo intenté con herramientas de línea de comandos, lo más cerca que estuve fue:
git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt
Sin embargo, este comando muestra un diff, y no el contenido del archivo. Sé que luego puedo usar algo como PAGER=caty redirigir la salida a un archivo, pero no sé cómo llegar al contenido real del archivo.
Básicamente, estoy buscando algo como svn cat .
git
single-file
Milan Babuškov
fuente
fuente

git show(sin ayuda) usa una sintaxis diferente con dos puntos.git show 2c7cf:my_file.txt>Respuestas:
Para completar su propia respuesta, la sintaxis es
El comando toma el estilo habitual de revisión, lo que significa que puede usar cualquiera de los siguientes:
HEAD+ x número de^caracteresConsejo Es importante recordar que cuando use "
git show", siempre especifique una ruta desde la raíz del repositorio , no su posición actual en el directorio.(Aunque Mike Morearty menciona que, al menos con git 1.7.5.4, puede especificar una ruta relativa colocando "
./" al comienzo de la ruta, por ejemplo:)
Con Git 2.23+ (agosto de 2019), también puede usar el
git restoreque reemplaza elgit checkoutcomando confusoEso restauraría en el árbol de trabajo solo el archivo como presente en el "origen" (
-s) confirma SHA1 o ramasomebranch.Para restaurar también el índice:
(
-SW: abreviatura de--staged --worktree)Antes de git1.5.x, eso se hizo con algunas tuberías:
git ls-tree <rev>muestra una lista de uno o más objetos 'blob' dentro de una confirmación
git cat-file blob <file-SHA1>cat un archivo como se ha confirmado dentro de una revisión específica (similar a svn cat). use git ls-tree para recuperar el valor de un archivo dado-sha1
git-ls-tree enumera el ID de objeto para $ file en la revisión $ REV, esto se corta de la salida y se usa como argumento para git-cat-file, que realmente debería llamarse git-cat-object, y simplemente vuelca ese objeto a stdout.
Nota: desde Git 2.11 (Q4 2016), ¡puede aplicar un filtro de contenido a la
git cat-filesalida!Ver commit 3214594 , commit 7bcf341 (09 de septiembre de 2016), commit 7bcf341 (09 de septiembre de 2016) y commit b9e62f6 , commit 16dcc29 (24 de agosto de 2016) por Johannes Schindelin (
dscho) .(Fusionada por Junio C Hamano -
gitster- en commit 7889ed2 , 21 sep 2016)Nota: "
git cat-file --textconv" comenzó a segfaularse recientemente (2017), que se ha corregido en Git 2.15 (Q4 2017)Ver commit cc0ea7c (21 de septiembre de 2017) por Jeff King (
peff) .(Fusionada por Junio C Hamano -
gitster- en commit bfbc2fc , 28 sep 2017)Tenga en cuenta que para anular / reemplazar un archivo con un contenido anterior, ya no debe usar el comando confuso
git checkout, perogit restore(Git 2.23+, agosto de 2019)Eso restauraría en el árbol de trabajo solo el archivo como presente en el "origen" (
-s) confirma SHA1.Para restaurar también el índice:
(
-SW: abreviatura de--staged --worktree)fuente
git showesencialmente volca el contenido en lastdout(salida estándar), simplemente puede redirigir esa salida a cualquier archivo que desee ( tldp.org/LDP/abs/html/io-redirection.html ).git checkout [branch | revision] filepathes el comando correctogit checkoutpodría invalidar su archivo por otra versión, a diferencia degit show, que le permite guardar con un nombre diferente, con el fin de obtener y ver tanto (la versión actual y la versión anterior). No queda claro a partir de la pregunta si el OP quiere reemplazar su versión actual por una antigua.^^^también se puede escribir de manera más general como~~~o, mejor~3,. El uso de tildes también tiene la ventaja de no activar la coincidencia de nombre de archivo de algunos shells (zsh, por ejemplo).git rev-parsemaneja larev:pathsintaxis? (En un git más reciente que puedagit cat-file -p $REV:path. Sin embargo,git showfunciona para rutas de directorio, así, por lo que no es sólo más corto, por lo general más cerca de lo que uno quiere.)Si desea reemplazar / sobrescribir el contenido de un archivo en su rama actual con el contenido del archivo de una confirmación anterior o una rama diferente, puede hacerlo con estos comandos:
o
Luego tendrá que confirmar esos cambios para que sean efectivos en la rama actual.
fuente
git show SHA1:PATHsolución solo se imprime en stdout.git help checkout. Tuve que pagar un subdirectorio a partir de una fecha determinada, y usando este enfoque, pude hacer que esta sintaxis funcionara:git checkout @{YYYY-MM-DD} sub-dirDebe proporcionar la ruta completa al archivo:
fuente
git show --name-onlyes suficiente demasiadofull/repo/path/toe intentas:git show 27cf8e84:my_file.txtserás recompensado con un mensaje como: fatal: la ruta 'full / repo / path / to / my_file.txt' existe, pero no 'my_file.txt' . ¿Quiso decir '27cf8e84: full / repo / path / to / my_file.txt', también conocido como '27cf8e84: ./ my_file.txt'? Es como, Git podría haber ayudado directamente, pero eligió ser pedante aquí.La forma más fácil es escribir:
dónde:
Ejemplo
Esto guardará my_file.txt de la revisión 27cf8e como un nuevo archivo con nombre my_file.txt.OLD
Fue probado con Git 2.4.5.
Si desea recuperar el archivo eliminado , puede usarlo
HASH~1(una confirmación antes de HASH especificado).EJEMPLO:
fuente
git log file/path/name.extEn Windows, con Git Bash:
git show cab485c83b53d56846eb883babaaf4dff2f2cc46:./your_file.ext > old.extfuente
Y para volcarlo en un archivo (al menos en Windows) - Git Bash:
Las
"comillas son necesarias para preservar las nuevas líneas.fuente
git showsintaxis que menciono anteriormente.Esto lo ayudará a obtener todos los archivos eliminados entre confirmaciones sin especificar la ruta, útil si hay muchos archivos eliminados.
fuente
Este comando obtiene el archivo copiado de confirmación específica.
fuente
Obtenga el archivo de una confirmación previa mediante la extracción de la confirmación previa y copiando el archivo.
git checkout 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8git checkout theBranchYouNotedgit commit -m "added file ?? from previous commit"fuente