ver tipos tag modificados log etiquetas crear comentarios archivos git

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]

Ver cual commit eliminó un archivo