Digamos que estoy en un repositorio Git. Elimino un archivo y confirmo ese cambio. Sigo trabajando y hago algunos compromisos más. Entonces, encuentro que necesito restaurar ese archivo.
Sé que puedo retirar un archivo usando git checkout HEAD^ foo.bar
, pero realmente no sé cuándo se eliminó ese archivo.
- ¿Cuál sería la forma más rápida de encontrar la confirmación que eliminó un nombre de archivo dado?
- ¿Cuál sería la forma más fácil de recuperar ese archivo en mi copia de trabajo?
Espero no tener que buscar manualmente mis registros, pagar el proyecto completo para un SHA determinado y luego copiar manualmente ese archivo en mi pago original del proyecto.
git
file-io
git-checkout
avdgaag
fuente
fuente
git log --diff-filter=D -- path/to/file
git checkout deletedFile
se recuperarádeletedFile
si se ha eliminado pero esa eliminación aún no se ha realizado o confirmado . Esa no es la pregunta que se hace aquí; Esta pregunta trata sobre cómo restaurar un archivo cuya eliminación se confirmó hace muchos commits.Respuestas:
Encuentra el último commit que afectó la ruta dada. Como el archivo no está en la confirmación HEAD, esta confirmación debe haberlo eliminado.
Luego revise la versión en el commit antes, usando el cursor (
^
símbolo ):O en un comando, si
$file
es el archivo en cuestión.Si está utilizando zsh y tiene habilitada la opción EXTENDED_GLOB, el símbolo de intercalación no funcionará. Puedes usar
~1
en su lugar.fuente
± git checkout $(git rev-list -n 1 HEAD "spec/Sporkfile_example.rb")^ -- "spec/Sporkfile_example.rb" zsh: no matches found: b71c152d8f38dcd23ad7600a93f261a7252c59e9^
Cambié a bash y funcionó bien sin embargo.error: pathspec <filename> did not match any file(s) known to git.
. La solución fue usar git bash.git checkout <deleting-commit>~1 -- <file-path>
~ X le permite especificar X commits antes del commit especificado, entonces ~ 1 es el commit antes, ~ 2 es dos commits antes, etc.^
personaje es el carácter de escape! Por lo tanto, en cmd, debe escribir^^
para indicarle a cmd que desea un único literal ^ y que no escapará de otra cosa después de él. Lo que le sucede a muchas personas es que^
le sigue un espacio. Entonces cmd cree que estás escapando del espacio, lo que simplemente produce un personaje espacial. Por lo tanto, cuando git obtiene los argumentos cli, veSHA1
y noSHA1^
. Es muy molesto.~
no es un personaje de escape, por eso todavía funciona. (PD: si crees que los googlers querrán esta información, por favor vota este comentario)git log --diff-filter=D --summary
para obtener todos los commits que han eliminado archivos y los archivos eliminados;git checkout $commit~1 path/to/file.ext
para restaurar el archivo eliminado.¿Dónde
$commit
está el valor de la confirmación que has encontrado en el paso 1, por ejemplo,e4cf499627
fuente
git log -- *PartOfMyFileName*
. Gracias por el$commit~1
git checkout $commit~1 filename
sintaxis funciona perfecta para archivos individuales y también para directorios completos. es decir: para restaurar todas las imágenes borradas en ./images del sha 12345:git checkout 12345~1 images
. gracias por esta respuesta!$commit~1
significa que debe agregar el nombre de la confirmación. Algo así como1d0c9ef6eb4e39488490543570c31c2ff594426c
donde$commit
está.Para restaurar todos esos archivos eliminados en una carpeta, ingrese el siguiente comando.
fuente
git
ha hecho incluso la tarea más simple.ls-files
subcomando es útil, pero no parece funcionar para archivos que se han eliminado,git rm
es decir, almacenados , y mucho menos confirmados, que es lo que solicitó el OP.M myChangedFile
despuésgit checkout
?Llegué a esta pregunta buscando restaurar un archivo que acabo de eliminar pero aún no había confirmado el cambio. En caso de que se encuentre en esta situación, todo lo que necesita hacer es lo siguiente:
git checkout HEAD -- path/to/file.ext
fuente
Si estás loco, úsalo
git-bisect
. Esto es lo que debes hacer:Ahora es el momento de ejecutar la prueba automatizada. El comando de shell
'[ -e foo.bar ]'
devolverá 0 sifoo.bar
existe, y 1 de lo contrario. El comando "ejecutar"git-bisect
utilizará la búsqueda binaria para encontrar automáticamente la primera confirmación donde falla la prueba. Comienza a la mitad del rango dado (de bueno a malo) y lo reduce a la mitad según el resultado de la prueba especificada.Ahora estás en el commit que lo eliminó. Desde aquí, puede volver al futuro y usar
git-revert
para deshacer el cambio,o podría retroceder un commit e inspeccionar manualmente el daño:
fuente
git bisect run '[ -e foo.bar ]'
?git bisect run
le dice a Git que automatice la bisección ejecutando el comando después de la palabra 'ejecutar' donde el comando debe regresar0
para unagood
versión (vergit help bisect
para más detalles). Esta'[ -e foo.bar ]'
es una expresión estándar para probar si el archivofoo.bar
existe (la implementación generalmente está en un archivo al/usr/bin/[
que normalmente está vinculado/usr/bin/test
) y las comillas simples se usan para poner todo eso como un argumento de línea de comando único.Mi nuevo alias favorito, basado en bonyiii 's respuesta (upvoted), y mi propia respuesta acerca de ' pasar un argumento a un comando de alias Git ':
¿Perdí un archivo, lo borré por error hace algunos commits?
Rápido:
Crisis evitada.
Advertencia, con Git 2.23 (Q3 2019) viene el comando experimental llamado
git restore
(!).Así que cambie el nombre de este alias (como se muestra a continuación).
Robert Dailey propone en los comentarios el siguiente alias:
Y jegan agrega en los comentarios :
fuente
restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"
git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\""
Expansion of alias 'restore' failed; '!git' is not a git command
Si conoce el nombre de archivo, esta es una manera fácil con comandos básicos:
Enumere todas las confirmaciones para ese archivo.
La última confirmación (la más alta) es la que eliminó el archivo. Por lo tanto, debe restaurar la penúltima confirmación.
fuente
Para restaurar un archivo borrado y comprometido:
Fue probado en Git versión 1.7.5.4.
fuente
error: pathspec 'foo' did not match any file(s) known to git.
aseguré de que el nombre del archivo fuera correcto. Git versión 2.7.0git add -A
, pero el archivo restaurado todavía estaba en una etapa no comprometida.Si solo realizó cambios y eliminó un archivo, pero no lo confirmó, y ahora rompió con sus cambios
pero sus archivos borrados no regresaron, simplemente ejecuta el siguiente comando:
Y listo, tu archivo está de vuelta.
fuente
Tengo esta solución .
Obtenga la identificación de la confirmación donde se eliminó el archivo utilizando una de las siguientes formas.
git log --grep=*word*
git log -Sword
git log | grep --context=5 *word*
git log --stat | grep --context=5 *word*
# recomendado si apenas recuerda algoDeberías obtener algo como:
3 . Ahora, usando el commit id bfe68bd117e1091c96d2976c99b3bcc8310bebe7 do:
Como el ID de confirmación hace referencia a la confirmación donde ya se eliminó el archivo, debe hacer referencia a la confirmación justo antes de bfe68b, lo que puede hacer agregando
^1
. Esto significa: dame el commit justo antes de bfe68b.fuente
fuente
git undelete path/to/file.ext
Ponga esto en su
.bash_profile
(u otro archivo relevante que se carga cuando abre un shell de comandos):Luego use:
Este alias primero comprueba para encontrar la última confirmación donde existió este archivo, y luego realiza un pago Git de esa ruta de archivo desde la última confirmación donde existió este archivo. Fuente .
fuente
En muchos casos, puede ser útil usar coreutils (grep, sed, etc.) junto con Git. Ya conozco estas herramientas bastante bien, pero Git no tanto. Si quisiera hacer una búsqueda de un archivo eliminado, haría lo siguiente:
Cuando encuentro la revisión / commit:
Al igual que otros han dicho antes que yo.
El archivo ahora se restaurará al estado que tenía antes de eliminarlo. Recuerde volver a confirmarlo en el árbol de trabajo si desea conservarlo.
fuente
Tuve que restaurar un montón de archivos eliminados de una confirmación específica, y lo logré con dos comandos:
(Tenga en cuenta el espacio final al final de cada comando).
Los archivos se agregaron al archivo .gitignore y luego se borraron con
git rm
. Necesitaba restaurar los archivos, pero luego quitarlos del escenario. Tenía cientos de archivos para restaurar, y escribir cosas manualmente para cada archivo como en los otros ejemplos iba a ser demasiado lento.fuente
En realidad, esta pregunta es directamente sobre Git, pero alguien como yo trabaja con herramientas de GUI como WebStorm VCS además de conocer los comandos de Git CLI.
Hago clic derecho en la ruta que contiene el archivo eliminado, y luego voy a Git y luego hago clic en Mostrar historial .
Las herramientas de VCS muestran el tren de todas las revisiones y puedo ver todos los compromisos y cambios de cada uno de ellos.
Luego selecciono las confirmaciones de que mi amigo elimine el
PostAd.js
archivo. ahora mira abajo:Y ahora, puedo ver mi archivo de deseo eliminado. Simplemente hago doble clic en el nombre del archivo y se recupera.
Sé que mi respuesta no son comandos Git, pero es rápido, confiable y fácil para desarrolladores principiantes y profesionales. Las herramientas de WebStorm VCS son increíbles y perfectas para trabajar con Git y no necesita ningún otro complemento o herramientas.
fuente
Tenía la misma pregunta. Sin saberlo, había creado una confirmación pendiente .
Lista de confirmaciones pendientes
git fsck --lost-found
Inspeccione cada confirmación pendiente
git reset --hard <commit id>
Mis archivos reaparecieron cuando me mudé a la confirmación pendiente.
git status
por la razón:“HEAD detached from <commit id where it detached>”
fuente
Restaurar el archivo eliminado:
fuente
Si conoce la confirmación que eliminó los archivos, ejecute este comando donde
<SHA1_deletion>
está la confirmación que eliminó el archivo:La parte anterior a la tubería enumera todos los archivos que se eliminaron en la confirmación; todos son de pago de la confirmación anterior para restaurarlos.
fuente
Encuentra el commit que eliminó tu archivo:
Salida de muestra:
A partir de Git 2.23 en realidad hay un
restore
comando. Todavía es experimental, pero para restaurar algo que eliminó en una confirmación (4711174 en este caso), puede escribir:Tenga en cuenta la ^ después de la identificación de confirmación, ya que queremos restaurar algo de la confirmación antes de la que eliminó el archivo.
El
--source
argumento le dice alrestore
comando dónde buscar los archivos para restaurar y puede ser cualquier confirmación e incluso el índice.Ver: git-restore doc para git 2.23.0
fuente
En nuestro caso, eliminamos accidentalmente archivos en una confirmación y algunas confirmaciones más tarde nos dimos cuenta de nuestro error y queríamos recuperar todos los archivos que se eliminaron, pero no los que se modificaron.
Basado en la excelente respuesta de Charles Bailey, aquí está mi frase:
fuente
Simple y preciso
En primer lugar, obtenga una última confirmación estable en la que tenga ese archivo:
Digamos que encuentra $ commitid 1234567 ..., entonces
Esto restaurará la versión del archivo que estaba en esa confirmación.
fuente
Para la mejor manera de hacerlo, pruébalo.
Primero, encuentre el id de confirmación del compromiso que eliminó su archivo. Le dará un resumen de las confirmaciones que eliminaron archivos.
Nota:
84sdhfddbddd
es tucommit id
A través de esto, puede recuperar fácilmente todos los archivos eliminados.
fuente
Siempre podría
git revert
su confirmación que eliminó el archivo. ( Esto supone que la eliminación fue el único cambio en la confirmación ) .Y si ha seguido trabajando y luego se dio cuenta de que no deseaba confirmar esa eliminación, puede revertirla usando:
Ahora
git log
muestra:Y
readme.md
ha sido restaurado en el repositorio.fuente
También tengo este problema al usar el siguiente código para recuperar un archivo anterior en un directorio local:
El siguiente ejemplo está funcionando para mí:
git checkout resources/views/usaSchools.blade.php
fuente
fuente
Si no se ha confirmado la eliminación, el siguiente comando restaurará el archivo eliminado en el árbol de trabajo.
Puede obtener una lista de todos los archivos eliminados en el árbol de trabajo utilizando el siguiente comando.
Si la eliminación se ha confirmado, busque la confirmación donde sucedió y luego recupere el archivo de esta confirmación.
En caso de que esté buscando la ruta del archivo para recuperar, el siguiente comando mostrará un resumen de todos los archivos eliminados.
fuente
Para restaurar todos los archivos eliminados con Git, también puede hacer:
Donde
git ls-files --deleted
enumera todos los archivos eliminados ygit checkout $(git command)
restaura la lista de archivos en un parámetro.fuente