tipos - git ver archivos modificados
Encuentra cuando un archivo fue eliminado en Git (4)
Tengo un repositorio Git con n confirmaciones.
Tengo un archivo que necesito, que solía estar en el repositorio, y que de repente busco y pienso "¡Oh! ¿A dónde se fue ese archivo?"
¿Hay una (serie de) comandos de Git que me dirán que "el archivo really_needed.txt se eliminó en la confirmación n-13"?
En otras palabras, sin mirar cada confirmación individual, y sabiendo que mi repositorio Git tiene todos los cambios de cada archivo, ¿puedo encontrar rápidamente la última confirmación que TIENE ese archivo, para poder recuperarla?
Respuesta corta:
git log --full-history -- your_file
le mostrará todas las confirmaciones en el historial de su repositorio, incluidas las confirmaciones de fusión, que tocaron your_file
. El último (arriba) es el que eliminó el archivo.
Alguna explicación:
La --full-history
aquí es importante. Sin él, Git realiza la "simplificación del historial" cuando le pide el registro de un archivo. Los documentos son claros en los detalles sobre cómo funciona esto exactamente y me falta el valor y el coraje necesarios para intentar descifrarlo a partir del código fuente, pero los documentos de git-log tienen mucho que decir:
Modo por defecto
Simplifica la historia a la historia más simple que explica el estado final del árbol. Más simple porque poda algunas ramas laterales si el resultado final es el mismo (es decir, fusionar ramas con el mismo contenido)
Obviamente, esto se refiere a cuándo se elimina el archivo cuyo historial queremos, ya que el historial más simple que explica el estado final de un archivo eliminado no es un historial . ¿Existe el riesgo de que el git log
sin --full-history
simplemente afirme 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$ touch foo && git add foo && git commit -m "Added foo"
[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$ touch bar && git add bar && git commit -m "Added bar"
[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 "Deleted bar"
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
Observe cómo git log -- bar
en el volcado de terminal anterior resultó en literalmente sin salida; Git está "simplificando" la historia en una ficción donde nunca existió la bar
. git log --full-history -- bar
, por otro lado, nos da la confirmación que creó la bar
y la confirmación que la eliminó.
Para ser claros: este tema no es meramente teórico. Solo miré los documentos y descubrí el --full-history
porque git log -- some_file
estaba fallando para mí en un repositorio real donde intentaba rastrear un archivo eliminado. La simplificación de la historia a veces puede ser útil cuando intenta comprender cómo llegó a estar un archivo actual en su estado actual, pero al intentar rastrear la eliminación de un archivo es más probable que lo arruine ocultando la confirmación que le interesa. . Utilice siempre el --full-history
para este caso de uso.
Acabo de agregar una solución aquí (¿hay una manera en git de enumerar 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 eliminado dentro de un directorio llamado some_dir
(en cascada). Cualquier sed regexp allí donde //some_dir//
is 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 }
Git registro pero necesita 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 <[email protected]>
Date: Tue Jul 26 23:32:20 2011 -0500
foo
git log -- [file path]
muestra los cambios de un archivo, funciona incluso si se eliminó el archivo.
git log -1 -- [file path]