modificados - git restaurar commit
Cómo recuperar un solo archivo de una revisión específica en Git (8)
Tengo un repositorio Git y me gustaría ver cómo se veía un archivo hace unos meses. Encontré la revisión en esa fecha, y es 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
. Necesito ver qué aspecto tenía un archivo y también guardarlo en un archivo.
gitk
ver el archivo usando gitk
, pero no tiene una opción para guardarlo. Probé con herramientas de línea de comandos, lo más cerca que pude obtener 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 del archivo real.
Básicamente, estoy buscando algo como svn cat .
Debe proporcionar la ruta completa al archivo:
git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:full/repo/path/to/my_file.txt
En Windows, con Git Bash:
- en su área de trabajo, cambie dir a la carpeta donde vive su archivo
-
git show cab485c83b53d56846eb883babaaf4dff2f2cc46:./your_file.ext > old.ext
Esto le ayudará a obtener todos los archivos eliminados entre confirmaciones sin especificar la ruta, útil si hay muchos archivos eliminados.
git diff --name-only --diff-filter=D $commit~1 $commit | xargs git checkout $commit~1
La forma más fácil es escribir:
git show HASH:file/path/name.ext > some_new_name.ext
dónde:
- HASH es el número de hash SHA-1 de revisión de Git
- file / path / name.ext es el nombre del archivo que está buscando
- some_new_name.ext es la ruta y el nombre donde se debe guardar el archivo antiguo
Ejemplo
git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:my_file.txt > my_file.txt.OLD
Esto guardará my_file.txt de la revisión 27cf8e como un nuevo archivo con el nombre my_file.txt.OLD
Fue probado con Git 2.4.5.
Si desea recuperar un archivo eliminado , puede usar HASH~1
(una confirmación antes de HASH especificado).
EJEMPLO:
git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8~1:deleted_file.txt > deleted_file.txt
Obtenga el archivo de una confirmación anterior mediante la verificación de la confirmación anterior y la copia del archivo.
- Observe en qué rama está: rama git
- Compruebe el compromiso anterior que desea:
git checkout 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
- Copia el archivo que deseas en una ubicación temporal.
- Verifique la rama desde la que comenzó:
git checkout theBranchYouNoted
- Copia en el archivo que colocaste en una ubicación temporal.
- Confirme su cambio en git:
git commit -m "added file ?? from previous commit"
Para completar tu propia respuesta, la sintaxis es de hecho
git show object
git show $REV:$FILE
git show somebranch:from/the/root/myfile.txt
git show HEAD^^^:test/test.py
El comando toma el estilo habitual de revisión, lo que significa que puede utilizar cualquiera de los siguientes:
- nombre de la rama (como lo suggested ash )
-
HEAD
+ x numero de caracteres - El hash SHA1 de una revisión dada
- Los primeros (quizás 5) caracteres de un hash SHA1 dado
Consejo 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 al poner " ./
" al comienzo de la ruta, por ejemplo:
git show HEAD^^:./test.py
)
Antes de git1.5.x, eso se hizo con algunas tuberías:
git ls-tree <rev>
mostrar una lista de uno o más objetos ''blob'' dentro de un commit
git cat-file blob <file-SHA1>
cat un archivo como se ha confirmado dentro de una revisión específica (similar a svn cat). usa git ls-tree para recuperar el valor de un archivo-sha1 dado
git cat-file -p $(git-ls-tree $REV $file | cut -d " " -f 3 | cut -f 1)::
git-ls-tree muestra el ID de objeto para $ file en la revisión $ REV, esto se recorta de la salida y se usa como un argumento para git-cat-file, que en realidad debería llamarse git-cat-object, y simplemente se vuelca ese objeto al stdout.
Nota: desde Git 2.11 (Q4 2016), puede aplicar un filtro de contenido a la salida del git cat-file
.
Consulte 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
- in commit 7889ed2 , 21 de septiembre de 2016)
cat-file
: soporte--textconv
/--filters
en modo batchAunque "
git hash-objects
", que es una herramienta para tomar un flujo de datos en el sistema de archivos y colocarlo en el almacén de objetos de Git, permitió realizar las conversiones de "mundo exterior a Git" (p. Ej., Final de conversiones de línea y aplicación del filtro limpio), y tenía la función activada de forma predeterminada desde muy temprano, su operación inversa "git cat-file
", que toma un objeto del almacén de objetos de Git y se externaliza para el consumo por parte de mundo exterior, carecía de un mecanismo equivalente para ejecutar el "Git-to-outside-world"
git config diff.txt.textconv "tr A-Za-z N-ZA-Mn-za-m <"
git cat-file --textconv --batch
Nota: " git cat-file --textconv
" comenzó a segfaulting recientemente (2017), que se corrigió en Git 2.15 (Q4 2017)
Ver commit cc0ea7c (21 de septiembre de 2017) por Jeff King ( peff
) .
(Combinado por Junio C Hamano - gitster
- in commit bfbc2fc , 28 de septiembre de 2017)
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:
git checkout 08618129e66127921fbfcbc205a06153c92622fe path/to/file.txt
o
git checkout mybranchname path/to/file.txt
A continuación, deberá confirmar esos cambios para que sean efectivos en la rama actual.
Y para volcarlo bien en un archivo (al menos en Windows) - Git Bash:
$ echo "`git show 60d8bdfc:src/services/LocationMonitor.java`" >> LM_60d8bdfc.java
Las "
citas son necesarias por lo que conserva nuevas líneas.