Pregunta Encuentra y restaura un archivo eliminado en un repositorio de Git


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 pagar un archivo usando 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 el compromiso 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.


2382
2018-06-04 22:40


origen


Respuestas:


Encuentra el último commit que afectó el camino dado. Como el archivo no está en el compromiso HEAD, este compromiso debe haberlo borrado.

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

A continuación, compruebe la versión en la confirmación anterior, utilizando el cursor (^) símbolo:

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á usando zsh y tiene habilitada la opción EXTENDED_GLOB, el símbolo de intercalación no funcionará. Puedes usar ~1 en lugar.

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

2718
2017-07-11 07:12



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

Dónde $commit es el valor de la confirmación que ha encontrado en el paso 1, p. e4cf499627


723
2018-06-04 23:10



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

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

301
2017-12-02 06:11



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


99
2018-04-10 00:03



Si estás loco, usa git-bisect. Esto es lo que debe 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 foo.bar existe, y 1 de lo contrario. El comando "ejecutar" de git-bisect utilizará la búsqueda binaria para encontrar automáticamente el primer compromiso donde falla la prueba. Comienza a la 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í, puedes retroceder al futuro y usar git-revert para deshacer el cambio,

git bisect reset
git revert <the offending commit>

o puede retroceder una confirmación e inspeccionar manualmente el daño:

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

82
2018-06-04 22:46



Mi nuevo alias favorito, basado en bonyiiies responder (votada) y mi propia respuesta sobre "Pasar un argumento a un comando Git alias":

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\"" 

61
2018-02-17 15:33



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

Lista todos los commits para ese archivo.

git log -- path/to/file

La última confirmación (superior) es la que eliminó el archivo. Por lo tanto, debe restaurar la segunda y última confirmación.

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

42
2018-02-27 01:50