É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 eliminé y en qué ruta estaba.
¿Cómo puedo localizar las confirmaciones de este archivo cuando existía?
É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 eliminé y en qué ruta estaba.
¿Cómo puedo localizar las confirmaciones de este archivo cuando existía?
Respuestas:
Si no conoce la ruta exacta que 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 antes del identificado, porque en el momento de <SHA>
confirmar el archivo se elimina, debemos mirar el compromiso anterior para obtener el contenido del archivo eliminado
git log -- <path>
no tendrá salida cuando se encuentre en una rama en la que el archivo nunca existió. Siempre debe usar git log --all -- <path>
, para asegurarse de no perderse los cambios que ocurrieron en otras ramas. El comando git log -- <path>
puede ser muy peligroso si tiene más de una rama y tiende a olvidar rutas y ramas (como yo) y también es peligroso si trabaja con otros desarrolladores.
git checkout <SHA>^ -- <path-to-file>
(tenga en cuenta el símbolo ^), porque en el momento de <SHA> confirmar el archivo se elimina, tenemos que mirar la confirmación anterior para obtener el contenido 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 diferencias del archivo eliminado
git show COMMIT_ID -- FILE_PATH
Recuerde, puede escribir la salida en un archivo usando >
like
git show COMMIT_ID -- FILE_PATH > deleted.diff
unknown revision or path not in the working tree
.
git log --diff-filter=D --summary | grep -E 'delete|^commit\s+\S+'
git-grep-latest(){ result_path=$(git log --diff-filter=D --summary | grep $1 | head -1 | awk '{print $4;}'); latest_commit=$(git log --all -- $result_path | head -1 | awk '{print $2;}'); git show $latest_commit -- $result_path; }
y ahora solo puede hacer:git-grep-latest some_text
linux pipes
... te gustará eso.
No se pudo editar la respuesta aceptada, por lo que se agrega aquí como respuesta,
para restaurar el archivo en git, use lo siguiente (observe el signo '^' justo después del SHA)
git checkout <SHA>^ -- /path/to/file
<SHA>~1
debería funcionar igual sin la necesidad de envolverlo con comillas.
Supongamos que desea recuperar un archivo llamado MyFile
, pero no está seguro de su ruta (o su extensión, para el caso):
Prelim .: evite la confusión dando un paso hacia la raíz git
Un proyecto no trivial puede tener múltiples directorios con nombres similares o idénticos.
> cd <project-root>
Encuentra el camino completo
git log --diff-filter = D --summary | grep eliminar | 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.
Determinar 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.
Retirar el archivo
Si elige el primer commit listado (el último cronológicamente, aquí bd8374c), el archivo no se encontrará, ya que se eliminó en ese commit.
> 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 (agregue un cursor):
> git checkout bd8374c^ -- full/path/to/MyFile.js
git log --diff-filter=D --summary | find "delete" | find "MyFile"
y step3, tenga en cuenta las comillas alrededor del hash:git checkout "bd8374c^" -- full/path/to/MyFile.js
¡@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.*
A continuación se muestra un comando simple, donde un usuario dev o git puede pasar un nombre de archivo eliminado del directorio raíz del repositorio 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, por favor hágalo.
Intente usar uno de los visores, de gitk
modo que pueda navegar por el historial para encontrar ese archivo medio recordado. (usar gitk --all
si es necesario para todas las ramas)
--all
opción es crítica tanto para su respuesta como para la respuesta aceptada.
Resumen:
Busca la ruta completa de su archivo en el historial de archivos eliminados git log --diff-filter=D --summary | grep filename
Restaura el archivo de confirmación antes de que se elimine
restore () {
filepath="$@"
last_commit=$(git log --all --full-history -- $filepath | grep commit | head -1 | awk '{print $2; exit}')
echo "Restoring file from commit before $last_commit"
git checkout $last_commit^ -- $filepath
}
restore my/file_path
Aquí está mi solución:
git log --all --full-history --oneline -- <RELATIVE_FILE_PATH>
git checkout <COMMIT_SHA>^ -- <RELATIVE_FILE_PATH>