¿Cómo recuperar los compromisos de Git para una determinada palabra?

Resuelto Jesper Rønn-Jensen asked hace 15 años • 9 respuestas

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).

Jesper Rønn-Jensen avatar Aug 27 '09 03:08 Jesper Rønn-Jensen
Aceptado

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:

  • -Gde forma predeterminada acepta una expresión regular, mientras que -Sacepta una cadena, pero se puede modificar para aceptar expresiones regulares usando el archivo --pickaxe-regex.
  • -Sbusca confirmaciones donde cambió el número de apariciones de "palabra", mientras que -Gencuentra confirmaciones donde aparece "palabra" en la diferencia.
  • Esto significa que -S<regex> --pickaxe-regexy -G<regex>no hagas exactamente lo mismo.

La git diffdocumentación tiene una buena explicación de la diferencia:

Para ilustrar la diferencia entre -S<regex> --pickaxe-regexy -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-regexno 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 grepaislar 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, 3b5ab0f2a1en este ejemplo, de esta manera:

$ git log 3b5ab0f2a1^.. -G"searchTerm" --patch | grep searchTerm
Jakub Narębski avatar Aug 27 '2009 10:08 Jakub Narębski

git logEl pico encontrará confirmaciones con cambios que incluyen "palabra" congit log -Sword

u0b34a0f6ae avatar Aug 26 '2009 20:08 u0b34a0f6ae

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... ;-)

CharlesW avatar Sep 04 '2016 16:09 CharlesW

Una forma/sintaxis más de hacerlo es: git log -S "word"
Así puedes buscar, por ejemplogit log -S "with whitespaces and stuff @/#ü !"

1u- avatar Feb 11 '2016 23:02 1u-

Puedes probar el siguiente comando:

git log --patch --color=always | less +/searching_string

o utilizando grepde 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.

kenorb avatar Sep 26 '2016 11:09 kenorb