file-io restaurar commit - Encuentra y restaura un archivo eliminado en un repositorio Git





10 Answers

  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

recuperar archivos borrados

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.




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 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.




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.




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.




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.




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>”




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.




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





Related