algorithm git diff que no separa las funciones (diferencia sensible al lenguaje)

¿Es posible configurar git diff para respetar la sangría y la syntax? No estoy hablando de ignorar sangrías y espacios, sino más bien utilizar líneas en blanco, niveles de sangría y posiblemente corchetes, para ayudar a emparejar las líneas viejas con las nuevas líneas.

Por ejemplo, git diff a menudo corta funciones y su docblock, así:

class C { /** + * Goes to the bar. + */ + function bar() { + return 'bar'; + } + + /** * Gets your foo up to date. */ function foo() { 

Cuando yo prefiero

  class C { + + /** + * Goes to the bar. + */ + function bar() { + return 'bar'; + } /** * Gets your foo up to date. */ function foo() { 

En este ejemplo, sigue siendo bastante inofensivo, pero hay ejemplos en los que las funciones y sus docblock están realmente desgarrados debido a la implementación de diff ambiciosa e ingenua.

Nota: Ya configuré *.php diff=php en ~/.gitattributes .

EDITAR: Otro ejemplo: Aquí git diff mezcla una propiedad docblock con un método docblock:

  /** - * @var int + * @param string $str */ 

No sé cómo hacerlo solo en git, pero hay al less una herramienta comercial (es decir, cuesta dinero) que se ocupa de ese tipo de problemas, llamada SemanticMerge .

Puede manejar una gran cantidad de casos interesantes y admite C #, Java y parcialmente C. Puede configurar git para usarlo como herramienta de fusión.

(No estoy afiliado)