Git: ¿Cómo encontrar un archivo eliminado en el historial de commit del proyecto?

Érase una vez, había un archivo en mi proyecto que ahora me gustaría poder obtener.

El problema es: no tengo idea de cuándo lo he eliminado y en qué camino estaba.

¿Cómo puedo localizar las confirmaciones de este archivo cuando existió?

Si no conoce el camino exacto, puede usar

git log --all --full-history -- **/thefile.* 

Si conoce la ruta en la que se encontraba el archivo, puede hacer esto:

 git log --all --full-history --  

Esto debería mostrar una lista de confirmaciones en todas las twigs que tocaron ese archivo. Luego, puede encontrar la versión del archivo que desea y mostrarla con …

 git show  --  

O restaurarlo en su copia de trabajo con:

git checkout ^ --

Tenga en cuenta el símbolo de intercalación ( ^ ), que obtiene el pago antes de la identificada, porque en el momento de comprometer el archivo se elimina, tenemos que mirar el compromiso anterior para obtener los contenidos del archivo eliminado

Obtenga una lista de los archivos eliminados y copie la ruta completa del archivo eliminado

 git log --diff-filter=D --summary | grep delete 

Ejecute el siguiente comando para encontrar la identificación de confirmación de esa confirmación y copie la identificación de confirmación

 git log --all -- FILEPATH 

Mostrar diff del archivo eliminado

 git show COMMIT_ID -- FILE_PATH 

Recuerde, puede escribir salida en un archivo usando > como

 git show COMMIT_ID -- FILE_PATH > deleted.diff 

No se pudo editar la respuesta aceptada para que se agregue como respuesta aquí,

para restaurar el archivo en git, use lo siguiente (observe el signo ‘^’ justo después del SHA)

 git checkout ^ -- /path/to/file 

@Amber dio la respuesta correcta! Solo una adición más, si no conoce la ruta exacta del archivo, puede usar comodines. Esto funcionó para mí.

 git log --all -- **/thefile.* 

Supongamos que desea recuperar un archivo llamado MyFile , pero no está seguro de su ruta (o su extensión, para el caso):

Prelim .: Evita la confusión yendo a la raíz de git

Un proyecto no trivial puede tener múltiples directorios con nombres similares o idénticos.

 > cd  
  1. Encuentra la ruta completa

    git log –diff-filter = D – resumen | eliminar grep | grep MyFile

    delete mode 100644 full/path/to/MyFile.js

full/path/to/MyFile.js es la ruta y el archivo que estás buscando.

  1. Determine todas las confirmaciones que afectaron ese archivo

    git log –oneline –follow – full / path / to / MyFile.js

    bd8374c Some helpful commit message

    ba8d20e Another prior commit message affecting that file

    cfea812 The first message for a commit in which that file appeared.

  2. Verifica el archivo

Si elige la confirmación listada en primer lugar (la última cronológicamente, aquí bd8374c), no se encontrará el archivo, ya que se eliminó en esa confirmación.

 > git checkout bd8374c -- full/path/to/MyFile.js `error: pathspec 'full/path/to/MyFile.js' did not match any file(s) known to git.` 

Simplemente seleccione la confirmación anterior (añadir un cursor):

 > git checkout bd8374c^ -- full/path/to/MyFile.js 

Intenta usar uno de los espectadores, como gitk para que puedas explorar el historial y encontrar ese archivo medio gitk . (use gitk --all si es necesario para todas las twigs)

Una de las cosas tediosas aquí es obtener la ruta del archivo eliminado, así que simplemente anoté un comando simple, donde un dev o un usuario de git puede pasar un nombre de archivo eliminado y obtener el historial:

 git log --diff-filter=D --summary | grep filename | awk '{print $4; exit}' | xargs git log --all -- 

Si alguien puede mejorar el comando, hazlo.