remove - git tags best practices
¿Cómo encontrar el commit Git que introdujo una cadena en cualquier rama? (6)
Quiero poder encontrar una cadena determinada 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 mirando las diferentes ramas (ignora 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 tu solución es lenta.
Jugando con las mismas respuestas:
$ git config --global alias.find ''!git log --color -p -S ''
- ! es necesario porque de otra manera, git no pasa el argumento correctamente a -S. Ver esta respuesta
- --color y -p ayuda a mostrar exactamente "lo que cambió"
Ahora puedes hacer
$ git find <whatever>
o
$ git find <whatever> --all
$ git find <whatever> master develop
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ó o 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.
git bisect start
y luego git bisect bad
, porque la revisión revisada tenía el problema. Como no sabía cuándo ocurrió el problema, apunté a la primera confirmación para el "bueno", git bisect good <initial sha>
.
Entonces seguí buscando en el repositorio el código malo. Cuando lo encontré, corrí 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. Muy bien
Tu puedes hacer:
git log -S <whatever> --source --all
Para encontrar todas las confirmaciones que agregaron o eliminaron la cadena fija . El parámetro --all
significa comenzar desde cada rama y --source
significa mostrar cuál de esas ramas llevó a encontrar ese compromiso. A menudo es útil agregar -p
para mostrar los parches que cada uno de esos compromisos también introduciría.
Las versiones de git desde 1.7.4 también tienen una opción -G
similar , que requiere una expresión regular . En realidad, esto tiene una semántica diferente (y bastante más obvia), explicada en esta publicación del blog de Junio Hamano .
Como señala thameera en los comentarios, debe colocar comillas alrededor del término de búsqueda si contiene espacios u otros caracteres especiales, por ejemplo:
git log -S ''hello world'' --source --all
git log -S "dude, where''s my car?" --source --all
Aquí hay un ejemplo que usa -G
para encontrar ocurrencias de la function foo() {
:
git log -G "^(/s)*function foo[(][)](/s)*{$" --source --all
--reverse también es útil ya que desea el primer compromiso que realizó el cambio:
git log --all -p --reverse --source -S ''needle''
De esta forma aparecerán las confirmaciones más antiguas primero.
share es excelente, pero he encontrado que esta versión más simple funciona para mí.
git log -S whatever
git log -S"string_to_search" # options like --source --reverse --all etc
Preste atención a no usar espacios entre S y "string_to_search". En algunas configuraciones (git 1.7.1), obtendrás un error como:
fatal: ambiguous argument ''string_to_search'': unknown revision or path not in the working tree.
Use ''--'' to separate paths from revisions