Я думаю, что в целом, чтобы получить то, что вы хотите, вам нужно выполнить какую-то операцию слияния / перебазирования, чтобы создать что-то для сравнения.
Когда вы действительно думаете об этом,Идея различий между наборами изменений нечеткая.Я предполагаю, что вы находитесь в такой ситуации:
[other history] [ "changeset 1" ]
o - o - o - o - o ( - o - o - o - o)
\
(o - o - o - o - o)
[ "changeset 2" ]
Так что же значит сравнивать эти два?Возможно, в вашем случае различия в другой истории полностью не связаны с изменениями двух наборов изменений, но в целом содержимое набора изменений 1 может зависеть от этой другой истории!Это означает, что у git нет общего способа выполнить такую операцию;чтобы сделать это должным образом, нужно было бы сказать: «Какая будет разница между двумя конечными коммитами, если я перебазирую?»Другими словами, я считаю, что единственное разумное определение различий между наборами изменений - это различие между полученными конечными коммитами, если они перебазированы, чтобы иметь общего предка.И, конечно, если это то, что вы хотите, то вам придется выполнить операцию в дереве работы - другого способа обойти с помощью различий, подобных этой, нет.Очевидная вещь, которую нужно сделать, это перебазировать и сравнить новые конечные точки (ветви):
[other history] [ "changeset 1" ]
o - o - o - o - o ( - o - o - o - o)
\
(o - o - o - o - o)
[ "changeset 2'" ]
Перебазировки не всегда самые забавные, и я могу придумать один маленький способ обойтиэтот.Полученное в результате рабочее дерево перебазировки, при условии правильного разрешения конфликтов, должно быть таким же, как результат слияния:
[other history] [ "changeset 1" ]
o - o - o - o - o ( - o - o - o - o)
\ \
\ ------
\ \
(o - o - o - o - o) - X
[ "changeset 2" ]
Таким образом, вы можете выполнить это временное слияние и сравнить полученный коммит сконец коммита другой ревизии.Это будет намного быстрее, чем делать ребаз.(В любом случае, вы, конечно, будете использовать одноразовую ветвь, а не реальную для ревизии 2.)