Ответ 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
).
Эта функция требует массажа, чтобы сделать его более полезным/менее хрупким, но я надеюсь, что вы поняли эту идею.