volver restaurar recuperar deshacer borrados borrado archivos anterior git file-io git-checkout

restaurar - Encuentra y restaura un archivo eliminado en un repositorio Git



recuperar commit borrado git (20)

Digamos que estoy en un repositorio Git. Borro un archivo y confío ese cambio. Sigo trabajando y hago algunos más compromisos. Entonces, encuentro que necesito restaurar ese archivo.

Sé que puedo desproteger un archivo utilizando git checkout HEAD^ foo.bar , pero realmente no sé cuándo se eliminó ese archivo.

  1. ¿Cuál sería la forma más rápida de encontrar la confirmación que eliminó un nombre de archivo determinado?
  2. ¿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, revisar todo el proyecto para un SHA determinado y luego copiar ese archivo manualmente en mi proyecto original.


git undelete path/to/file.ext

  1. Ponga esto en su .bash_profile (u otro archivo relevante que se carga cuando abre un comando shell):

    git config --global alias.undelete ''!sh -c "git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1" -''

  2. Luego use:

    git undelete path/to/file.ext

Este alias primero verifica para encontrar la última confirmación donde existía este archivo, luego realiza una comprobación de git de esa ruta de acceso de esa última confirmación donde existía este archivo. source


  1. Utilice git log --diff-filter=D --summary para obtener todas las confirmaciones que han eliminado archivos y los archivos eliminados;
  2. Use git checkout $commit~1 filename para restaurar el archivo eliminado.

Donde $commit es el valor del commit que ha encontrado en el paso 1, por ejemplo, e4cf499627


Así que tuve que restaurar un montón de archivos eliminados de una confirmación específica y lo logré con dos comandos:

git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git checkout <rev>^ -- git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git reset HEAD

(Tenga en cuenta el espacio 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 eliminarlos. Tenía cientos de archivos para restaurar, escribir cosas manualmente para cada archivo como en los otros ejemplos iba a ser demasiado lento.


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:

git log --raw | grep -B 30 $''D/t.*deleted_file.c''

Cuando encuentro la revisión / commit:

git checkout <rev>^ -- path/to/refound/deleted_file.c

Al igual que otros han dicho antes de mí.

El archivo ahora se restaurará al estado que tenía antes de la eliminación. Recuerde volver a asignarlo al árbol de trabajo si desea mantenerlo cerca.


En nuestro caso, eliminamos accidentalmente los archivos en una confirmación y, 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.

Basándome en la excelente respuesta de Charles Bailey, aquí está mi única línea:

git co $(git rev-list -n 1 HEAD -- <file_path>)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- <file_path>)~1 head | grep ''^D'' | cut -f 2)


Encuentra la última confirmación que afectó la ruta dada. Como el archivo no está en la confirmación HEAD, esta confirmación debe haberla eliminado.

git rev-list -n 1 HEAD -- <file_path>

Luego verifique la versión en la confirmación anterior, usando el símbolo caret ( ^ ):

git checkout <deleting_commit>^ -- <file_path>

O en un comando, si $file es el archivo en cuestión.

git checkout $(git rev-list -n 1 HEAD -- "$file")^ -- "$file"

Si está utilizando zsh y tiene la opción EXTENDED_GLOB habilitada, el símbolo de intercalación no funcionará. Puedes usar ~1 lugar.

git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"


Llegué a esta pregunta para 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


Mi nuevo alias favorito, basado en la answer bonyiii (upvoted), y mi propia respuesta sobre " Pasar un argumento a un comando de alias de Git ":

git config alias.restore ''!f() { git checkout $(git rev-list -n 1 HEAD -- $1)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- $1)~1 | grep ''^D'' | cut -f 2); }; f''

He perdido un archivo, borrado por error hace unos pocos confirmaciones?
Rápido:

git restore my_deleted_file

Crisis evitada.

Robert Dailey propone en los comentarios el siguiente alias:

restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"

Y jegan añade en los comentarios :

Para establecer el alias desde la línea de comando, usé este comando:

git config --global alias.restore "/!git checkout /$(git rev-list -n 1 HEAD -- /"/$1/")^ -- /"/$1/""


Para restaurar todos los archivos eliminados en una carpeta, ingrese el siguiente comando.

git ls-files -d | xargs git checkout --


Para restaurar un archivo eliminado y comprometido:

git reset HEAD some/path git checkout -- some/path

Fue probado en la versión 1.7.5.4 de Git.


Sencillo y preciso.

En primer lugar, obtenga una confirmación estable más reciente en la que tenga ese archivo:

git log

Digamos que encuentras $ commitid 1234567 ..., entonces

git checkout <$commitid> $fileName

Esto restaurará la versión del archivo que estaba en ese commit.


Si conoce el nombre de archivo, esta es una manera fácil con comandos básicos:

Listar todas las confirmaciones para ese archivo.

git log -- path/to/file

La última confirmación (la más alta) es la que eliminó el archivo. Así que necesitas restaurar el segundo para confirmar por última vez.

git checkout {second to last commit} -- path/to/file


Si conoce la confirmación que eliminó los archivos, ejecute este comando donde <SHA1_deletion> es la confirmación que eliminó el archivo:

git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --

La parte anterior a la tubería enumera todos los archivos que se eliminaron en la confirmación; Todos ellos son checkout de la confirmación anterior para restaurarlos.


Si estás loco, usa git-bisect . Esto es lo que hay que hacer:

git bisect start git bisect bad git bisect good <some commit where you know the file existed>

Ahora es el momento de ejecutar la prueba automatizada. El comando de shell ''[ -e foo.bar ]'' devolverá 0 si existe foo.bar , y 1 de lo contrario. El comando "ejecutar" de git-bisect usará la búsqueda binaria para encontrar automáticamente la primera confirmación donde falla la prueba. Comienza a mitad del rango dado (de bueno a malo) y lo corta a la mitad según el resultado de la prueba especificada.

git bisect run ''[ -e foo.bar ]''

Ahora estás en la confirmación que lo eliminó. Desde aquí, puede volver al futuro y usar git-revert para deshacer el cambio,

git bisect reset git revert <the offending commit>

o puede retroceder un compromiso e inspeccionar manualmente el daño:

git checkout HEAD^ cp foo.bar /tmp git bisect reset cp /tmp/foo.bar .


Si solo realizó cambios y eliminó un archivo, pero no lo confirmó, y ahora terminó con sus cambios

git checkout -- .

pero sus archivos eliminados no regresaron, simplemente haga el siguiente comando:

git checkout <file_path>

Y listo, tu archivo está de vuelta.


Tenía la misma pregunta. Sin saberlo, había creado un compromiso colgando .

Lista de compromisos pendientes

git fsck --lost-found

Inspeccionar cada compromiso colgando

git reset --hard <commit id>

Mis archivos reaparecieron cuando me mudé a la confirmación colgando.

git status por la razón:

“HEAD detached from <commit id where it detached>”


Tengo esta solución .

  1. Obtenga el ID de la confirmación donde se eliminó el archivo utilizando una de las formas a continuación.

    • git log --grep=*word*
    • git log -Sword
    • git log | grep --context=5 *word*
    • git log --stat | grep --context=5 *word* git log --stat | grep --context=5 *word* # recomendado si apenas recuerda algo
  2. Deberías conseguir algo como:

cometer bfe68bd117e1091c96d2976c99b3bcc8310bebe7 Autor: Alexander Orlov Fecha: Jue 12 de mayo 23:44:27 2011 +0200

replaced deprecated GWT class - gwtI18nKeySync.sh, an outdated (?, replaced by a Maven goal) I18n generation script

commit 3ea4e3af253ac6fd1691ff6bb89c964f54802302 Autor: Alexander Orlov Fecha: Jue 12 de mayo 22:10:22 2011 +0200

3 . Ahora usando el ID de confirmación bfe68bd117e1091c96d2976c99b3bcc8310bebe7 haz:

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

Como el ID de confirmación hace referencia a la confirmación en la que ya se eliminó el archivo, debe hacer referencia a la confirmación justo antes de bfe68b, que puede hacer agregando ^1 . Esto significa: dame el commit justo antes de bfe68b.


$ git log --diff-filter=D --summary | grep "delete" | sort


git checkout /path/to/deleted.file


user@bsd:~/work/git$ rm slides.tex user@bsd:~/work/git$ git pull Already up-to-date. user@bsd:~/work/git$ ls slides.tex ls: slides.tex: No such file or directory

Restaurar el archivo eliminado:

user@bsd:~/work/git$ git checkout D .slides.tex.swp D slides.tex user@bsd:~/work/git$ git checkout slides.tex user@bsd:~/work/git$ ls slides.tex slides.tex