Используйте трехстороннюю разность для различий

Другой ТАК вопрос показывает, как настроить git использовать трехстороннюю разность для конфликтов слияния.

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

1 ответ

Решение

Боюсь, ответ - нет.

Обоснованием этого является то, что независимо от того, как вы указываете аргументы при вызове git diff, он всегда учитывает только две сущности (BLOB-объекты или деревья (большую часть времени выводимые из коммитов, ссылающихся на них)). Другими словами, это по замыслу: 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).

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

Другие вопросы по тегам