50

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

例如 git diff 经常会切入函数和它们的文档块,像这样:

 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() {

在这个例子中,它仍然是无害的,但有些例子中,由于贪婪和幼稚的 diff 实现,函数和它们的 docblock 真的被撕裂了。

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

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

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

2 回答 2

5

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

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

(我不隶属。)

于 2014-07-11T11:44:24.377 回答
2

首先使用更复杂的差异算法,例如:

git config --global diff.algorithm histogram

然后还有语义差异工具,如https://github.com/GumTreeDiff/gumtree,其算法也已在 clang-diff 中实现:https ://github.com/krobelus/clang-diff-playground

于 2018-11-13T01:03:14.027 回答