Encuentra y restaura un archivo eliminado en un repositorio de Git



Answers

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

Digamos que estoy en un repositorio de Git. Borro un archivo y confirmo ese cambio. Sigo trabajando y realizando más commits. Entonces, me parece que necesito restaurar ese archivo.

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

  1. ¿Cuál sería la forma más rápida de encontrar la confirmación que eliminó un nombre de archivo dado?
  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 copiarlo manualmente en el proceso de pago original de mi proyecto.




En muchos casos, puede ser útil usar coreutils (grep, sed, etc.) junto con Git. Ya conozco estas herramientas bastante bien, pero Git lo es menos. 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 / confirmación:

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

Al igual que otros han declarado antes que yo.

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




Tengo esta solución .

  1. Obtenga el ID de la confirmación donde se eliminó el archivo usando 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* git log --stat | grep --context=5 *word* # recomendado si apenas recuerda algo
  2. Deberías obtener algo como:

commit 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 la identificación de confirmación bfe68bd117e1091c96d2976c99b3bcc8310bebe7 do:

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

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




Llegué a esta pregunta buscando restaurar un archivo que acababa de eliminar, pero aún no había confirmado el cambio. En caso de que te encuentres en esta situación, todo lo que debes hacer es lo siguiente:

git checkout HEAD -- path/to/file.ext




En nuestro caso, borramos accidentalmente los archivos en una confirmación y algunos confirmamos 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 único trazador de líneas:

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)



Para restaurar un archivo eliminado y confirmado:

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

Fue probado en la versión 1.7.5.4 de Git.




Así que tuve que restaurar un grupo 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 habían agregado al archivo .gitignore y luego se borraron con git rm, necesitaba restaurar los archivos, pero luego los quité. Tenía que restaurar cientos de archivos, escribir cosas manualmente para cada archivo, como en los otros ejemplos iba a ser demasiado lento.




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, eliminado por error algunos commits hace?
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 agrega en los comentarios :

Para configurar el alias desde la línea de comando, utilicé este comando:

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



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

Lista de compromisos pendientes

git fsck --lost-found

Inspeccionar cada compromiso colgante

git reset --hard <commit id>

Mis archivos reaparecieron cuando cambié al compromiso pendiente.

git status por la razón:

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




Related