Используйте три метода diff для diff

Другой S.O. вопрос показывает, как настроить git использовать трехсторонний diff для конфликтов слияния.

Можно ли настроить этот трехсторонний стиль как стандартное для стандартной операции diff? Если я попрошу разницу между версиями, где есть общий корень (это не только одна из версий), изменения от общего корня будут показаны в diff.

Ответ 1

Я боюсь, что ответ отрицательный.

Важным для этого является то, что независимо от того, как вы указываете аргументы при вызове git diff, он всегда рассматривает только две сущности (капли или деревья (большую часть времени, выведенные из коммитов, ссылающихся на них)). Другими словами, что по дизайну: git diff рассматривает отдельные объекты и не выполняет никакого исторического обхода. Чтобы привести справочную страницу git diff:

Более подробный список способов написания <commit> см. в разделе "УКАЗАНИЕ РЕВИЗИОНОВ" в разделе gitrevisions(7). Однако "diff" - это сравнение двух конечных точек, а не диапазоны и обозначения диапазона ( "<commit>..<commit>" и "<commit>...<commit>" ) не означает диапазон, определенный в разделе "УКАЗАНИЕ ДИАПАЗОНОВ", в разделе gitrevisions(7).

С другой стороны, с подходящей оболочкой, вы должны быть способны сделать это сами. Скажем, с учетом двух коммитов rev1 и rev2 вы можете использовать

git-diff3() {
  local rev1="$1" rev2="$2"
  diff3 <(git show "$rev1") \
        <(git show $(git merge-base "$rev1" "$rev2")) \
        <(git show "$rev2")
}

в оболочке, которая понимает <(...) (например, bash).

Эта функция требует массажа, чтобы сделать его более полезным/менее хрупким, но я надеюсь, что вы поняли эту идею.