Tengo un repositorio 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) comando (s) de Git que me dirá que "file realmente_needed.txt fue eliminado en commit n-13"?
En otras palabras, sin mirar cada confirmación individual y sabiendo que mi repositorio de Git tiene cada cambio de cada archivo, ¿puedo encontrar rápidamente la última confirmación que TIENE ese archivo, para poder recuperarlo?
Respuestas:
git log --full-history -- [file path]
muestra los cambios de un archivo, funciona incluso si el archivo fue eliminado.Ejemplo:
Si desea ver solo la última confirmación, que eliminó un archivo, use -1 además, por ejemplo,
git log --full-history -1 -- [file path]
Ver qué confirmación eliminó un archivo
fuente
git log -- */<<filename>>.<<file extension>>
sin conocer la ruta completa del archivo.Respuesta corta:
le mostrará todas las confirmaciones en la historia de su repositorio, incluidas las confirmaciones de fusión, que se tocaron
your_file
. El último (superior) es el que eliminó el archivo.Alguna explicación:
La
--full-history
bandera aquí es importante. Sin él, Git realiza una "simplificación del historial" cuando le solicita el registro de un archivo. Los documentos son ligeros sobre los detalles sobre cómo funciona esto exactamente y me falta el valor y el coraje necesarios para tratar de resolverlo a partir del código fuente, pero los documentos de git-log tienen mucho que decir:Esto es obviamente preocupante cuando se elimina el archivo cuyo historial queremos , ya que el historial más simple que explica el estado final de un archivo eliminado es sin historial . ¿Existe el riesgo de que
git log
sin--full-history
simplemente afirme que el archivo nunca fue creado? Por desgracia sí. Aquí hay una demostración:Observe cómo
git log -- bar
en el volcado de la terminal anterior resultó literalmente sin salida; Git está "simplificando" la historia en una ficción dondebar
nunca existió.git log --full-history -- bar
, por otro lado, nos da el commit que creóbar
y el commit que lo eliminó.Para ser claros: este problema no es meramente teórico. Solo busqué en los documentos y descubrí la
--full-history
bandera porque megit log -- some_file
estaba fallando en un repositorio real donde estaba tratando de rastrear un archivo eliminado. Simplificar la historia a veces puede ser útil cuando usted está tratando de entender cómo una existente en la actualidad archivo llegó a estar en su estado actual, pero cuando se trata de localizar a un archivo borrado es más probable que el tornillo que sobre ocultando la de comprometerse usted se preocupa por . Utilice siempre la--full-history
bandera para este caso de uso.fuente
git log
salida en sí, no es del todo obvio que la última confirmación haya eliminado el archivo. También intentégit log --name-status --full-history -- file_name
ygit log -p --stat --full-history -- file_name
, pero ninguno indica explícitamente que el archivo se eliminó en la última confirmación. Esto parece un error.mkdir somedir && cd somedir && git init && touch foo && git add foo && git commit -m "Added foo" && git checkout -b newbranch && touch bar && git add bar && git commit -m "Added bar" && git checkout master && git rm foo && git commit -m "Deleted foo" && git checkout newbranch && git rm bar && git commit -m "Deleted bar" && git checkout master && git merge newbranch && git log --name-status --full-history -- bar
incluyeD bar
yA bar
para mí en la salida del registro con Git 2.12.2. ¿No ves esas líneas en la salida? ¿Qué versión tienes?git version 2.15.1
Sí, su secuencia de comando informaD bar
yA bar
. Quizás mi problema es particular al historial de mi archivo. Estaba rastreando el historial de un.htaccess
archivo que fue eliminado y eliminado. Finalmente lo descubrí y volví a agregar el archivo. Cuando lo incluyo--name-status
en elgit log
comando, veo dosA .htaccess
entradas (ya que lo agregué en el último commit) pero noD .htaccess
. Por lo tanto, parece que en algunos casos, aunque se haya eliminado un archivo del repositorio,git log
no se mostrará unaD file_name
entrada explícita ..htaccess
se agregó en un commit X pero luego no se incluyó en el commit de fusión que trajo X al maestro. Eso es lo único en lo que puedo pensar que podría argumentar que debería parecer un archivo que se ha agregado y nunca eliminado y que aún no está presente. Sería interesante tratar de descubrir un MCVE, luego determinar si es un error de Git y, de no ser así, si es posible modificar mi respuesta para manejar su caso.Git log pero necesita prefijar la ruta con
--
P.ej:
fuente
Acabo de agregar una solución aquí (¿hay alguna manera en git para enumerar todos los archivos eliminados en el repositorio?) Para encontrar las confirmaciones de los archivos eliminados mediante el uso de una expresión regular:
Esto devuelve todo lo eliminado dentro de un directorio llamado
some_dir
(en cascada). Cualquier sed regexp allí donde\/some_dir\/
está será suficiente.OSX (gracias a @triplee y @keif)
fuente
sed: 1: "/^commit/h;/\/some_dir\ ...": bad flag in substitute command: '}'
sed
aparentemente no siempre es bueno con punto y coma como separadores de comandos. Intente cambiarlos a nuevas líneas o cambie ased -n -e '/^commit/h' -e '\:/some_dir/:{' -e G -e 's/\ncommit \(.*\)/ \1/gp' -e }
git log --diff-filter=D --summary | sed -n -e '/^commit/h' -e '\:/:{' -e G -e 's/\ncommit \(.*\)/ \1/gp' -e }
trabajé para mí en OSX.Puede encontrar la última confirmación que eliminó el archivo de la siguiente manera:
Más información disponible aquí
fuente
Tratar:
fuente