remote - Usar git para encontrar la primera introducción de token en una línea específica de un archivo
git push tag (5)
Digamos que tengo un archivo A.cpp y veo un error en la línea 15 del archivo. Digamos que el error es un "const" en una función que devuelve un puntero a una variable miembro, lo que significa que usar const en la función es técnicamente correcto pero semánticamente incorrecto. Me gustaría discutir la semántica con el autor que hizo el cambio.
Usando git, ¿hay alguna manera de averiguar qué revisión introdujo el token "const"? Más específicamente, me gustaría saber quién introdujo el token.
"Git culpa" muestra quién hizo el último cambio en la línea, pero en realidad me gustaría encontrar la primera confirmación que contenga el token.
Si la línea existía sin el token const
en alguna confirmación que usted sabe, puede comenzar allí y usar el indicador --reverse
en git-culpa para encontrar la última revisión en la cual la línea no tenía el token const
. Luego solo mira la siguiente revisión en el archivo después de eso.
Utilizo QGit para esto, selecciono las líneas de interés y lo filmo , luego solo se ve la lista de cambios para esa línea. Para una sola línea no es necesario saltar algunas revisiones.
vía:
- abrir QGit en el repositorio
- abrir vista de árbol
- encontrar archivo
- buscar línea
- seleccione línea de interés
- presione el botón ''revisar filtro de líneas seleccionadas'', se ve como un embudo.
git bisect es lo que estás buscando. Con este comando puedes encontrar rápidamente qué commit introdujo la const.
Comienza el proceso con git bisect start
, luego marca una versión anterior sin la const como buena con git bisect good
y la actual como bisect bad
. Entonces el sistema te enviará a una versión en el medio. Puedes verificar si el conflicto maligno está allí y marcar esa versión como buena o mala según sea el caso. Luego, el proceso se repite hasta que encuentre el compromiso incorrecto.
El cambio puede no haber estado siempre en la línea 15 de A.cpp
, por lo tanto, use el contexto circundante. Digamos que fue una definición de const int foobar
:
git grep ''const *int *foobar'' /
$(git log --reverse --pretty=format:%H -- A.cpp) -- /
A.cpp | head -1
Esto busca en el tiempo a través de todos los commits en la rama actual que tocan A.cpp
y encuentra el primero que contiene el patrón ofensivo. El resultado será el SHA-1 del compromiso y la línea coincidente en su revisión de A.cpp
.
Una vez que conozca el compromiso, use git show
para conocer al autor.
Hay algunas formas posibles de hacerlo.
git blame
, o mejor herramienta gráfica de culpa (como lagit gui blame
o la vista de culpa engit instaweb
/ gitweb) para explorar el historial de una línea, retrocediendo en la historia hasta que encuentres la confirmación adecuada.llamada "búsqueda de pico", es decir
git log -S
con token / regexp apropiado, para encontrar (enumerar) todos los commits donde el número de tokens dados ha cambiado (lo que generalmente significa que el token dado se ha agregado o eliminado), por ejemplo:git log --reverse -p -S''const int foobar'' -- A.cpp
git bisect
donde "malo" commit significaría el que tiene ''const'' donde no debería estar (prueba usando eg grep).