¿Es posible get un git diff claro cuando se reemplaza una function por completo?

Entonces, me he encontrado con este problema algunas veces. Durante una ronda de cambios, elimino functionA() y agrego functionB() en el mismo lugar. Cuando ejecuto un diff , termino con un espantoso set de cambios confusos donde se intenta emparejar las dos funciones en sus llaves comunes en lugar de mostrar todas las functionA como eliminación y todas las functionB como una adición. Para un ejemplo simplificado:

 int functionA(int a, bool b) { int c; bool d; if (a == b) { //do stuff } //do more stuff } 

Reemplazado con

 void functionB() { // do different stuff for (int x=0; x<10; x++) { //do more different stuff } //do even more different stuff } 

el diff puede ceder

 -int functionA(int a, bool b) +void functionB() { - int c; - bool d; - if (a == b) + // do different stuff + for (int x=0; x<10; x++) { - //do stuff + //do more different stuff } - //do more stuff + //do even more different stuff } 

Lo cual es inútil y difícil de leer, ya que en realidad no hay nada en común además de los refuerzos. Incluso omitirá las llaves que no se alinean hasta que encuentre las que sí lo hacen, lo cual es bastante común. Y en un caso que estoy viendo ahora, eliminé 7 funciones consecutivas y agregué 3, que hacen más o less lo mismo de una manera mucho más fácil de leer / mantener. El algorithm diff desembolsa las adiciones de manera dispersa a través de las 7 funciones eliminadas, lo que crea un desorder confuso e ilegible.

¿Hay alguna manera de modificar git diff para ignorar los casos en que la única característica común es un corsé?

Si es importante, mi sistema actualmente tiene git 1.9.0 y diff (difftools de GNU) 2.8.1 Etiqueté C ++ porque el sistema en el que trabajo es (principalmente C-style) C ++, pero esto debería aplicarse a varios otros lenguajes.

Mientras buscaba las preguntas existentes, lo más cerca que podía encontrar era ¿Para qué sirve la git diff --patience de git diff --patience ? Sin embargo, esto tuvo muy poco impacto en mi diff. (Es diferente, pero no visiblemente más claro)

También veo en la página de manual de git diff la opción –break-rewrites, que hace lo que quiero, pero solo en el nivel de file, no en el nivel de function.

Si nada más, supongo que puedo intentar crear un hábito en el futuro de poner nueva lógica en una parte completamente diferente del file de cualquier eliminación en los casos en que quiera que el diff muestre la adición en un bloque, pero preferiría para mantener la lógica relacionada en set.

Git actualmente 1 ofrece cuatro algorithms de diferencia, conocidos como myers (el pnetworkingeterminado), minimal , patience e histogram . El último es un ligero toque de patience . Sin embargo, todos estaban en la versión 1.9.0 de Git. Si ninguno de ellos hace lo que quieres, puedes decirle a Git que use una diferencia externa . Consulte la sección "Generación de text de diferencias" de la documentation de gitattributes (que hace reference a la documentation principal de git) para get más información. Es un poco complicado, pero para resumir, usas gitattributes para obligar a Git a ejecutar el progtwig de diferencias externo, y defines el progtwig de diferencias externo escribiendo un script (generalmente sh / bash) y configurándolo en tu configuration global o por repository .


1 A partir de la versión 2.8.x de todos modos; 2.9 está casi fuera y no tiene ninguno nuevo.