2011-04-05 27 views
10

Tengo un archivo que se ha roto en algún momento, y he encontrado el último punto en el que todavía se ha solucionado.usando git para comparar un archivo de dos commits

Me gustaría saber cómo, usando git, puedo comparar un archivo de dos commits, o de hecho si esa es la mejor manera de jugar esto.

Respuesta

14

para responder directamente a su pregunta, supongamos que desea comparar el archivo src/toaster.c entre su actual master y el viejo cometer f4l4f3l, sólo se puede hacer:

git diff master f4l4f3l -- src/toaster.c 

Como alternativa, puede simplemente mirar a través de todo los cambios en ese archivo con:

git log -p -- src/toaster.c 

en términos más generales, sin embargo, si usted está tratando de encontrar el comprometen donde ap error articular fue introducido, git tiene una herramienta maravillosa para esto, llamada git bisect. Si le dices a esta herramienta un compromiso que funciona y no funciona, te dará una serie de compromisos para probarlos, utilizando una estrategia de búsqueda binaria.

Comenzarías bisectriz con el comando:

git bisect start 

Entonces si su actual cometer tiene el error, que acaba de hacer:

git bisect bad 

continuación, es necesario encontrar una mayor comprometen que definitivamente no tenía el error. Esto puede tener una etiqueta en particular, o tal vez solo elegirás una confirmación que fue hace algunos meses. Supongamos que uno se llama a12b3d, a continuación, puede hacer:

git checkout a12b3d 
git bisect good 

En ese momento, Git va a funcionar el próximo envío tendrá que probar, y hacer que git checkout a moverse a esa confirmación. (Estas cajas serán todas con "HEAD separada", por lo que su puntero de rama original no se modifica). Luego prueba esa confirmación, y ejecuta git bisect good o git bisect bad dependiendo de si tiene el error o no. Esta búsqueda binaria entre las revisiones se reducirá rápidamente al primer compromiso incorrecto, e informará cuál es. A continuación, para volver a lo que estaba haciendo, que puede hacer:

git bisect reset 
+0

Gracias por esto, pero antes de empezar, ¿no debería utilizar 'bisección bien' después de encontrar el compromiso que no tiene el error? –

+0

Vaya, sí, debería haber sido 'git checkout a12b3d; git bisect bueno'. He corregido ese error tipográfico en la respuesta ahora. –

+0

Bien, entonces he encontrado mi compromiso incorrecto, y puedo ver qué está mal. ¿Cuál es la mejor manera de cambiar eso y sacarlo adelante? –

3
$ git diff $start_commit..$end_commit -- path/to/file 

Por ejemplo, puede ver la diferencia de un archivo "file.c" de aquí a dos commits hacia atrás

$ git diff HEAD^^..HEAD -- file.c 

Espero que te ayude

+0

http://hekate.homeip.net/2010/03/git-comparing-changes-between-commits/ –