He borrado un archivo o algún código de un archivo en algún momento del pasado. ¿Puedo buscar en el contenido (no en los mensajes de confirmación)?
Una solución muy pobre es hacer grep en el log:
git log -p | grep <pattern>
Sin embargo, esto no devuelve el hash de la confirmación de inmediato. He jugado con git grep
sin éxito.
Para buscar el contenido de las confirmaciones (es decir, las líneas reales del código fuente, a diferencia de los mensajes de confirmación y similares), debe hacer lo siguiente
git grep <regexp> $(git rev-list --all)
git rev-list --all | xargs git grep <expresión>
funcionará si te encuentras con un error "Argument list too long".
Si quieres limitar la búsqueda a algún subárbol (por ejemplo, "lib/util"), tendrás que pasarlo al subcomando rev-list
y a grep
también:
git grep <regexp> $(git rev-list --all -- lib/util) -- lib/util
Esto buscará en todo el texto de la confirmación regexp
.
La razón para pasar la ruta en ambos comandos es porque rev-list
devolverá la lista de revisiones donde se produjeron todos los cambios en lib/util
, pero también es necesario pasarlo a grep
para que sólo busque en lib/util
.
Imagínese el siguiente escenario: grep
podría encontrar el mismo <regexp>
en otros ficheros que están contenidos en la misma revisión devuelta por rev-list
(incluso si no hubo ningún cambio en ese fichero en esa revisión).
Aquí hay otras formas útiles de buscar en su fuente:
Buscar en el árbol de trabajo texto que coincida con la expresión regular regexp:
git grep <regexp>
Buscar en el árbol de trabajo líneas de texto que coincidan con la expresión regular regexp1 o regexp2:
git grep -e <regexp1> [--or] -e <regexp2>
Buscar en el árbol de trabajo las líneas de texto que coincidan con la expresión regular regexp1 y regexp2, informando sólo de las rutas de los archivos:
git grep -e <regexp1> --and -e <regexp2>
Buscar en el árbol de trabajo las líneas de texto que coincidan con la expresión regular regexp1 y las líneas de texto que coincidan con la expresión regular regexp2:
git grep -l --all-match -e <regexp1> -e <regexp2>
Buscar en el árbol de trabajo las líneas de texto modificadas que coincidan con el patrón:
git diff --unified=0 | grep <pattern>
Buscar en todas las revisiones el texto que coincida con la expresión regular regexp:
git grep <regexp> $(git rev-list --all)
Buscar en todas las revisiones entre rev1 y rev2 el texto que coincida con la expresión regular regexp:
git grep <regexp> $(git rev-list <rev1>..<rev2>)
Debe utilizar la opción pico (-S
) de git log
Para buscar Foo
:
git log -SFoo -- path_containing_change
git log -SFoo --since=2009.1.1 --until=2010.1.1 -- path_containing_change
Ver Historial Git - encontrar línea perdida por palabra clave para más.
Como comentó Jakub Narębski:
esto busca las diferencias que introducen o eliminan una instancia de <cadena>
.
Suele significar "revisiones en las que se ha añadido o eliminado una línea con `Foo'".
la opción --pickaxe-regex
le permite utilizar regex POSIX extendido en lugar de buscar una cadena.
Como comentó Rob, esta búsqueda distingue entre mayúsculas y minúsculas - abrió una pregunta de seguimiento sobre cómo buscar sin distinguir entre mayúsculas y minúsculas.
Entonces, ¿estás tratando de buscar en versiones anteriores del código para ver dónde existe algo por última vez?
Si yo estuviera haciendo esto, probablemente usaría git bisect. Usando bisect, puedes especificar una versión buena conocida, una versión mala conocida, y un simple script que hace una comprobación para ver si la versión es buena o mala (en este caso un grep para ver si el código que estás buscando está presente). Ejecutando esto se encontrará cuando el código fue eliminado.