Pregunta 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ó?


856
2017-08-26 10:43


origen


Respuestas:


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 -- <path-to-file>

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

git show <SHA> -- <path-to-file>

O restaurarlo en su copia de trabajo con:

git checkout <SHA>^ -- <path-to-file>

Tenga en cuenta el símbolo de intercalación (^), que obtiene el pago anterior al identificado, porque en el momento de <SHA> confirmar que el archivo se eliminó, tenemos que mirar el compromiso anterior para obtener los contenidos del archivo eliminado


1066
2017-08-26 10:46



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 > me gusta

git show COMMIT_ID -- FILE_PATH > deleted.diff

302
2018-02-19 04:53



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 <SHA>^ -- /path/to/file

35
2018-04-03 15:51



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

21
2018-01-08 16:36



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

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

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

> cd <project-root>
  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

15
2018-03-03 15:35



Intenta usar uno de los espectadores, como gitk para que pueda navegar por el historial y encontrar ese archivo medio olvidado. (utilizar gitk --all si es necesario para todas las ramas)


14
2017-08-26 12:59



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.


11
2018-01-30 18:24