Git алгоритм diff, который не разделяет функции отдельно? (знание языков)

Можно ли настроить 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() {

В этом примере он по-прежнему совершенно безвреден, но есть примеры, когда функции и их docblock действительно разрываются друг от друга из-за жадной и наивной реализации diff.

Примечание. Я уже настроил *.php diff=php в ~/.gitattributes.

EDIT: Другой пример: Здесь git diff смешивает свойство docblock с методом docblock:

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

Ответ 1

Я не знаю, как это сделать только в git, но есть хотя бы один коммерческий инструмент (т.е. он стоит денег), который имеет дело с такими проблемами, называемыми SemanticMerge.

Он может обрабатывать довольно много интересных случаев и поддерживает С#, Java и частично C. Вы можете настроить git для использования в качестве инструмента слияния.

(Я не аффилирован.)