¿Cómo recuperar los compromisos de Git para una determinada palabra?
En un repositorio de código Git quiero enumerar todas las confirmaciones que contienen una palabra determinada. Probé esto
git log -p | grep --context=4 "word"
pero no necesariamente me devuelve el nombre del archivo (a menos que esté a menos de cinco líneas de la palabra que busqué. También intenté
git grep "word"
pero solo me da archivos presentes y no el historial.
¿Cómo busco en todo el historial para poder seguir los cambios en una palabra en particular? Tengo la intención de buscar en mi base de código apariciones de palabras para rastrear cambios (buscar en el historial de archivos).
Si desea encontrar todas las confirmaciones donde el mensaje de confirmación contiene una palabra determinada, utilice
$ git log --grep=word
Si desea encontrar todas las confirmaciones en las que se agregó o eliminó "palabra" en el contenido del archivo (para ser más exactos: donde cambió el número de apariciones de "palabra"), es decir, buscar el contenido de la confirmación , utilice el llamado ' búsqueda de pico con
$ git log -Sword
En Git moderno también hay
$ git log -Gword
para buscar diferencias cuya línea agregada o eliminada coincida con "palabra" (también confirme contenidos ).
Algunas cosas a tener en cuenta:
-G
de forma predeterminada acepta una expresión regular, mientras que-S
acepta una cadena, pero se puede modificar para aceptar expresiones regulares usando el archivo--pickaxe-regex
.-S
busca confirmaciones donde cambió el número de apariciones de "palabra", mientras que-G
encuentra confirmaciones donde aparece "palabra" en la diferencia.- Esto significa que
-S<regex> --pickaxe-regex
y-G<regex>
no hagas exactamente lo mismo.
La git diff
documentación tiene una buena explicación de la diferencia:
Para ilustrar la diferencia entre
-S<regex> --pickaxe-regex
y-G<regex>
, considere una confirmación con la siguiente diferencia en el mismo archivo:+ return frotz(nitfol, two->ptr, 1, 0); ... - hit = frotz(nitfol, mf2.ptr, 1, 0);
Mientras que
git log -G"frotz\(nitfol"
mostrará esta confirmación,git log -S"frotz\(nitfol" --pickaxe-regex
no lo hará (porque el número de apariciones de esa cadena no cambió).
Esto mostrará las confirmaciones que contienen los términos de búsqueda, pero si desea ver los cambios reales en esas confirmaciones, puede usar --patch
:
$ git log -G"searchTerm" --patch
Luego, esto se puede canalizar para grep
aislar la salida solo para mostrar líneas de diferenciación de confirmación con ese término de búsqueda. Un caso de uso común es mostrar líneas de diferencias con ese término de búsqueda en confirmaciones desde e incluyendo una confirmación determinada, 3b5ab0f2a1
en este ejemplo, de esta manera:
$ git log 3b5ab0f2a1^.. -G"searchTerm" --patch | grep searchTerm
git log
El pico encontrará confirmaciones con cambios que incluyen "palabra" congit log -Sword
Después de mucha experimentación, puedo recomendar lo siguiente, que muestra confirmaciones que introducen o eliminan líneas que contienen una expresión regular determinada y muestra los cambios de texto en cada una, con colores que muestran las palabras agregadas y eliminadas.
git log --pickaxe-regex -p --color-words -S "<regexp to search for>"
Aunque tarda un poco en ejecutarse... ;-)
Una forma/sintaxis más de hacerlo es: git log -S "word"
Así puedes buscar, por ejemplogit log -S "with whitespaces and stuff @/#ü !"
Puedes probar el siguiente comando:
git log --patch --color=always | less +/searching_string
o utilizando grep
de la siguiente manera:
git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string'
Ejecute este comando en el directorio principal donde desea buscar.