2012-08-17 14 views
5

Imagina una clase dentro de un proyecto git que se ha sometido a 1000 commits, re-visitados una y otra vez. ¿Hay alguna posibilidad de que examine cuándo exactamente (a qué compromiso) se introdujo una línea específica de código en la clase?¿Cómo puedo encontrar qué compromiso introdujo una línea específica en git? ¿O hay una mejor alternativa?

Si no, ¿hay una alternativa para ir hacia cada compromiso para encontrar el conjunto de líneas en las que tengo un interés particular?

Ty.

Respuesta

3

Puede usar git bisect para retroceder cuando se introdujo determinado código (consulte http://git-scm.com/book/en/Git-Tools-Debugging-with-Git) y podría utilizar esta técnica para verificar el código cada vez y luego ver si la línea aún está presente. Esto hace que la búsqueda de O (log n) en lugar de O (n), que le ahorra un montón de tiempo ...

Si quieres saber cuando una línea es la última editado, puede utilizar git blame.

+2

Hay una forma de buscar historias de cadenas específicas en git. En realidad es bastante fácil. Verifique mi respuesta para más detalles. – Christopher

+0

¡Agradable! Aún así, necesitaría saber cómo se veía la línea (o al menos partes de ella) cuando se introdujo por primera vez. –

+0

Definitivamente cierto, pero todavía lo encuentro uno de los comandos más útiles en mi proverbial caja de herramientas git. – Christopher

10

¿Una línea específica de código? ¿Como sabes cuál es la línea por adelantado? Claro que es posible. De hecho, es estúpido fácil. Sólo tiene que utilizar la opción de búsqueda pico en git log:

-S<string> 
    Look for differences that introduce or remove an instance of <string>. Note that this is different than the string simply appearing in diff output; 
    see the pickaxe entry in gitdiffcore(7) for more details. 

Supongamos que la clase es public class Foo {, se puede encontrar cada commit que tocar esa cuerda con:

git log -S"public class Foo" 

Si desea limitarlo a un archivo en particular , sólo tiene que utilizar la sintaxis estándar --:

git log -S"public class Foo" -- Foo.java 

En general, utilice esto:

git log -S<string> [-- <file>] 
Cuestiones relacionadas