不区分function的git diffalgorithm? (语言意识差异)

可以configurationgit diff来尊重缩进和语法吗? 我不是在谈论忽略缩进和空格,而是使用空行,缩进级别和可能的括号来帮助将旧行匹配到新行。

例如,git diff通常会切换函数和docblock,如下所示:

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

当我更喜欢

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

在这个例子中,它仍然是非常无害的,但是有一些例子,function和它们的docblock由于贪婪和天真的差异实现而被真正的撕开了。

注意:我已经在~/.gitattributesconfiguration了*.php diff=php

编辑:另一个例子:在这里git diff混合一个方法docblock属性docblock:

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

我不知道如何在git上单独做这件事,但至less有一个商业工具(即花钱)来处理这种问题,称为SemanticMerge 。

它可以处理很多很酷的情况,并支持C#,Java和部分C.你可以configurationgit使用它作为合并工具。

(我不隶属于)