git diff算法不会破坏功能?(语言识别差异)

don*_*ote 47 language-agnostic git diff semantic-diff

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

例如,git diff经常切换函数及其docblock,如下所示:

 class C {

   /**
+   * Goes to the bar.
+   */
+  function bar() {
+    return 'bar';
+  }
+
+  /**
    * Gets your foo up to date.
    */
   function foo() {
Run Code Online (Sandbox Code Playgroud)

当我愿意的时候

 class C {
+
+  /**
+   * Goes to the bar.
+   */
+  function bar() {
+    return 'bar';
+  }

   /**
    * Gets your foo up to date.
    */
   function foo() {
Run Code Online (Sandbox Code Playgroud)

在这个例子中它仍然是非常无害的,但是有些例子中函数及其docblock由于贪婪和天真的diff实现而被撕裂.

注意:我已经配置*.php diff=php~/.gitattributes.

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

   /**
-   * @var int
+   * @param string $str
    */
Run Code Online (Sandbox Code Playgroud)

hen*_*nko 5

我不知道如何单独在 git 中做到这一点,但至少有一个商业工具(即它要花钱)可以处理这类问题,称为SemanticMerge

它可以处理很多很酷的情况,并且支持 C#、Java 和部分 C。您可以配置 git 将其用作合并工具。

(我没有附属。)

  • 尽管如此,在 git 中有一些基于缩进级别或其他某种作弊的东西会很好,假装是语言感知但实际上不是。 (2认同)