Pregunta Encuentra cuando un archivo fue eliminado en Git


Tengo un repositorio de Git con n commits.

Tengo un archivo que necesito, y que solía estar en el repositorio, y que de repente busco y pienso "¡Oh! ¿A dónde fue ese archivo?"

¿Hay una (serie de) comandos de Git que me digan que "el archivo really_needed.txt fue eliminado en la confirmación n-13"?

En otras palabras, sin mirar cada compromiso individual, y sabiendo que mi repositorio de Git tiene cada cambio de cada archivo, ¿puedo encontrar rápidamente el último compromiso que TIENE ese archivo, para poder recuperarlo?


669
2017-07-27 04:23


origen


Respuestas:


git log -- [file path] muestra los cambios de un archivo, funciona incluso si el archivo fue eliminado.

git log -1 -- [file path]

Ver Which commit borró un archivo


720
2018-05-19 13:48



Respuesta corta:

git log --full-history -- your_file

te mostrará todas se compromete en el historial de su repositorio, incluidas las asignaciones de fusión, que tocaron your_file. El último (arriba) es el que eliminó el archivo.

Alguna explicación:

los --full-history La bandera aquí es importante. Sin él, Git realiza una "simplificación del historial" cuando le pide el registro de un archivo. Los documentos son livianos en detalles sobre cómo funciona esto exactamente y carezco de la agalla y el coraje necesarios para tratar de descifrarlo a partir del código fuente, pero los documentos de git-log tiene mucho que decir:

Modo por defecto

Simplifica la historia a la historia más simple que explica el estado final del árbol. El más simple porque corta algunas ramas laterales si el resultado final es el mismo (es decir, fusionando ramas con el mismo contenido)

Esto es obviamente preocupante cuando el archivo cuya historia queremos es borrado, ya que la historia más simple que explica el estado final de un archivo eliminado es no historia. ¿Hay un riesgo de que git log sin --full-history simplemente afirmará que el archivo nunca se creó? Por desgracia sí. Aquí hay una demostración:

mark@lunchbox:~/example$ git init
Initialised empty Git repository in /home/mark/example/.git/
mark@lunchbox:~/example$ toca foo && git agrega foo && git commit -m "Fo añadido"
[master (root-commit) ddff7a7] Added foo
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 foo
mark@lunchbox:~/example$ git checkout -b newbranch
Switched to a new branch 'newbranch'
mark@lunchbox:~/example$ toque la barra && git agregue la barra && git commit -m "Barra agregada"
[newbranch 7f9299a] Added bar
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 bar
mark@lunchbox:~/example$ GIT Checkout Master
Switched to branch 'master'
mark@lunchbox:~/example$ git rm foo && git commit -m "Deleted foo"
rm 'foo'
[master 7740344] Deleted foo
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 foo
mark@lunchbox:~/example$ git checkout newbranch
Switched to branch 'newbranch'
mark@lunchbox:~/example$ git rm bar && git commit -m "Barra eliminada"
rm 'bar'
[newbranch 873ed35] Deleted bar
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 bar
mark@lunchbox:~/example$ GIT Checkout Master
Switched to branch 'master'
mark@lunchbox:~/example$ git merge newbranch
Already up-to-date!
Merge made by the 'recursive' strategy.
mark@lunchbox:~/example$ git log - foo
commit 77403443a13a93073289f95a782307b1ebc21162
Author: Mark Amery 
Date:   Tue Jan 12 22:50:50 2016 +0000

    Deleted foo

commit ddff7a78068aefb7a4d19c82e718099cf57be694
Author: Mark Amery 
Date:   Tue Jan 12 22:50:19 2016 +0000

    Added foo
mark@lunchbox:~/example$ git log - bar
mark@lunchbox:~/example$ git log --full-history - foo
commit 2463e56a21e8ee529a59b63f2c6fcc9914a2b37c
Merge: 7740344 873ed35
Author: Mark Amery 
Date:   Tue Jan 12 22:51:36 2016 +0000

    Merge branch 'newbranch'

commit 77403443a13a93073289f95a782307b1ebc21162
Author: Mark Amery 
Date:   Tue Jan 12 22:50:50 2016 +0000

    Deleted foo

commit ddff7a78068aefb7a4d19c82e718099cf57be694
Author: Mark Amery 
Date:   Tue Jan 12 22:50:19 2016 +0000

    Added foo
mark@lunchbox:~/example$ git log --full-history - bar
commit 873ed352c5e0f296b26d1582b3b0b2d99e40d37c
Author: Mark Amery 
Date:   Tue Jan 12 22:51:29 2016 +0000

    Deleted bar

commit 7f9299a80cc9114bf9f415e1e9a849f5d02f94ec
Author: Mark Amery 
Date:   Tue Jan 12 22:50:38 2016 +0000

    Added bar

Date cuenta cómo git log -- bar en el vertedero de la terminal anterior no se obtuvo literalmente ninguna salida; Git está "simplificando" la historia en una ficción donde bar nunca existió. git log --full-history -- bar, por otro lado, nos da el compromiso que creó bar y el compromiso que lo borró.

Para ser claro: este problema no es meramente teórico. Solo busqué en los documentos y descubrí el --full-history bandera porque git log -- some_file estaba fallando para mí en un repositorio real donde estaba tratando de rastrear un archivo eliminado. La simplificación de la historia a veces puede ser útil cuando intenta comprender cómo actualmente existente archivo llegó a estar en su estado actual, pero al intentar rastrear un archivo supresión es más probable que te arruine al ocultar el compromiso que te importa. Usa siempre el --full-history bandera para este caso de uso.


160
2018-01-12 23:00



Git log pero necesitas prefijar la ruta con --

P.ej:

dan-mac:test dani$ git log file1.txt
fatal: ambiguous argument 'file1.txt': unknown revision or path not in the working tree.

dan-mac:test dani$ git log -- file1.txt
 commit 0f7c4e1c36e0b39225d10b26f3dea40ad128b976
 Author: Daniel Palacio <danpal@gmail.com>
 Date:   Tue Jul 26 23:32:20 2011 -0500

 foo

81
2017-07-27 04:35



Acabo de agregar una solución aquí (¿Hay alguna manera en git de listar todos los archivos eliminados en el repositorio?) para encontrar las confirmaciones de archivos eliminados usando una expresión regular:

git log --diff-filter=D --summary | sed -n '/^commit/h;/\/some_dir\//{G;s/\ncommit \(.*\)/ \1/gp}'

Esto devuelve todo lo borrado dentro de un directorio llamado some_dir (en cascada). Cualquier expresión regular sed allí donde \/some_dir\/ es lo que haré

OSX (gracias a @triplee y @keif)

git log --diff-filter=D --summary | sed -n -e '/^commit/h' -e '\:/:{' -e G -e 's/\ncommit \(.*\)/ \1/gp' -e }

18
2017-10-23 10:11