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=cat
y 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 restore
que reemplaza elgit checkout
comando 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-file
salida!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 show
esencialmente 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] filepath
es el comando correctogit checkout
podrí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-parse
maneja larev:path
sintaxis? (En un git más reciente que puedagit cat-file -p $REV:path
. Sin embargo,git show
funciona 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:PATH
solució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-dir
Debe proporcionar la ruta completa al archivo:
fuente
git show --name-only
es suficiente demasiadofull/repo/path/to
e intentas:git show 27cf8e84:my_file.txt
será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.ext
En Windows, con Git Bash:
git show cab485c83b53d56846eb883babaaf4dff2f2cc46:./your_file.ext > old.ext
fuente
Y para volcarlo en un archivo (al menos en Windows) - Git Bash:
Las
"
comillas son necesarias para preservar las nuevas líneas.fuente
git show
sintaxis 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 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
git checkout theBranchYouNoted
git commit -m "added file ?? from previous commit"
fuente