Как сравнить наборы изменений в Git? - PullRequest
12 голосов
/ 18 февраля 2011

Git позволяет очень легко сравнивать различия между коммитами, используя, например, команды git diff и difftool.Также в TortoiseGit вы просто выбираете два коммита для их сравнения.

Но есть ли способ сравнить наборы изменений ?Другими словами: увидеть различия между разностями одного набора коммитов и разностями другого набора коммитов.

Это было бы очень удобно для сравнения (наборов) коммитов, которые выбраны вишней или были перебазированы.

Ответы [ 4 ]

12 голосов
/ 18 февраля 2011

Может быть diff <(git show rev1) <(git show rev2) будет делать то, что вы хотите?

5 голосов
/ 18 февраля 2011

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

Когда вы действительно думаете об этом,Идея различий между наборами изменений нечеткая.Я предполагаю, что вы находитесь в такой ситуации:

[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.)

1 голос
/ 17 декабря 2016

Вот что мне помогло сравнить две ревизии:

git diff [base_sha_a]..[final_sha_a] > ./a.diff
git diff [base_sha_b]..[final_sha_b] > ./b.diff
diff ./a.diff ./b.diff

Если результат команды diff пуст, наборы изменений одинаковы. В противном случае вы увидите разницу между двумя разностями.

0 голосов
/ 18 февраля 2011
git diff end_rev_1...end_rev_2

Взято из: http://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html

Аналогичное обозначение r1 ... r2 называется симметричной разностью r1 и r2 и определяется как r1 r2 - not $ (git merge-base - все r1 r2).Это набор коммитов, которые доступны с одного из r1 или r2, но не с обоих.

И из справки git diff:

git diff [--options] <commit>...<commit> [--] [<path>...]
   This form is to view the changes on the branch containing and up to the second <commit>, starting at a
   common ancestor of both <commit>. "git diff A...B" is equivalent to "git diff $(git-merge-base A B) B".
   You can omit any one of <commit>, which has the same effect as using HEAD instead.

Это работает для вас

...