Quiero poder encontrar cierta cadena que se introdujo en cualquier confirmación en cualquier rama, ¿cómo puedo hacer eso? Encontré algo (que modifiqué para Win32), pero git whatchanged
no parece estar buscando en las diferentes ramas (ignore el fragmento py3k, es solo una solución de alimentación de línea msys / win)
git whatchanged -- <file> | \
grep "^commit " | \
python -c "exec(\"import sys,msvcrt,os\nmsvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)\nfor l in sys.stdin: print(l.split()[1])\")" | \
xargs -i% git show origin % -- <file>
Realmente no importa si su solución es lenta.
Respuestas:
Tu puedes hacer:
Para encontrar todas las confirmaciones que agregaron o eliminaron la cadena fija
whatever
. El--all
parámetro significa comenzar desde cada rama y--source
significa mostrar cuál de esas ramas condujo a encontrar esa confirmación. A menudo es útil agregar-p
para mostrar los parches que cada uno de esos commits también introduciría.Las versiones de git desde 1.7.4 también tienen una
-G
opción similar , que toma una expresión regular . Esto en realidad tiene una semántica diferente (y bastante obvia), explicada en esta publicación de blog de Junio Hamano .Como thameera señala en los comentarios, debe poner comillas alrededor del término de búsqueda si contiene espacios u otros caracteres especiales, por ejemplo:
Aquí hay un ejemplo usando
-G
para encontrar ocurrencias defunction foo() {
:fuente
--decorate
solo agrega el nombre de la rama al commit en la punta de cada rama. En la práctica realmente no uso--source
o--decorate
, y en su lugar utilizargit branch -a --contains <commit-hash>
para encontrar qué ramas contienen el commit que me interesa.git log -S"dude, where's my car?" --source --all
. @ribamar también escribió eso en una respuesta a continuación, pero podría pasar desapercibido fácilmente junto a esta respuesta principal.--reverse también es útil ya que desea la primera confirmación que realizó el cambio:
De esta manera, los commits más antiguos aparecerán primero.
fuente
La respuesta de Mark Longair es excelente, pero he encontrado que esta versión más simple funciona para mí.
fuente
HEAD
, pero esta pregunta particular se hizo específicamente sobre buscar en todas las ramas en un repositorio.Jugando con las mismas respuestas:
Ahora puedes hacer
o
fuente
Preste atención para no usar espacios entre S y "string_to_search". En algunas configuraciones (git 1.7.1), obtendrá un error como:
fuente
Si bien esto no responde directamente a su pregunta, creo que podría ser una buena solución para usted en el futuro. Vi una parte de mi código, que era malo. No sabía quién lo escribió ni cuándo. Pude ver todos los cambios del archivo, pero estaba claro que el código se había movido de otro archivo a este. Quería encontrar quién realmente lo agregó en primer lugar.
Para hacer esto, usé Git bisect , que rápidamente me permitió encontrar al pecador.
Corrí
git bisect start
y luegogit bisect bad
, porque la revisión revisada tenía el problema. Como yo no sé cuándo ocurrió el problema, me dirigidos el primero de confirmación para la "buena",git bisect good <initial sha>
.Luego seguí buscando en el repositorio el código incorrecto. Cuando lo encontré, me encontré
git bisect bad
, y cuando no estaba allí:git bisect good
.En ~ 11 pasos, cubrí ~ 1000 confirmaciones y encontré la confirmación exacta, donde se introdujo el problema. Bastante genial
fuente
No estoy seguro de por qué la respuesta aceptada no funciona en mi entorno, finalmente ejecuto el siguiente comando para obtener lo que necesito
fuente