如何比较Git中的变更集?

如何比较Git中的变更集?,git,compare,diff,commit,tortoisegit,Git,Compare,Diff,Commit,Tortoisegit,Git使比较提交之间的差异变得非常容易,例如使用Git命令diff和difftool。同样在Ortoisegit中,您只需选择两个提交来比较它们 但是有没有办法比较变更集呢?换句话说:查看一组提交的差异与另一组提交的差异 这将非常方便地比较(一组)经过精心挑选或重定基础的提交 git diff end_rev_1...end_rev_2 摘自: 类似的符号r1…r2被称为 r1和r2的对称差和 定义为r1 r2——而不是$(git 合并基——所有r1(r2)。这是布景 可从中访问的提交的数目

Git使比较提交之间的差异变得非常容易,例如使用Git命令diff和difftool。同样在Ortoisegit中,您只需选择两个提交来比较它们

但是有没有办法比较变更集呢?换句话说:查看一组提交的差异与另一组提交的差异

这将非常方便地比较(一组)经过精心挑选或重定基础的提交

git diff end_rev_1...end_rev_2
摘自:

类似的符号r1…r2被称为 r1和r2的对称差和 定义为r1 r2——而不是$(git 合并基——所有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.
git diff[--options]。。。[--] [...]
此表单用于查看包含到第二个分支的分支上的更改,从
两者的共同祖先。“git diff A…B”相当于“git diff$(git merge base A B)B”。
您可以省略其中任何一个,这与使用HEAD具有相同的效果。

这对你有用吗?

我认为,一般来说,为了得到你想要的东西,你必须做一些合并/重基操作,以便创建一些可以比较的东西

当你仔细考虑时,变更集之间的差异是模糊的。我在这里假设你的处境是这样的:

[other history]   [ "changeset 1" ]
o - o - o - o - o ( - o - o - o - o)
 \
  (o - o - o - o - o)
  [ "changeset 2" ]
那么,比较这两者意味着什么呢?可能在您的情况下,其他历史记录中的差异与两个变更集的差异完全不相交,但一般来说,变更集1的内容可能取决于其他历史记录!这意味着git没有好的通用方法来执行这样的操作;为了正确地执行,它必须从本质上说“如果我重定基址,两个端提交之间的差异会是什么?”换句话说,我认为更改集之间差异的唯一合理定义是,如果它们重定基址以具有共同祖先,则结果端提交之间的差异。当然,如果这是您想要的,那么您必须在工作树中执行一个操作-没有其他方法可以像这样处理diff。显然,要做的事情是重新设置基础,并比较新的端点(分支):

不过,回扣并不总是最有趣的,我可以想出一个小办法来解决这个问题。假设您适当地解决了冲突,则重新基础的结果工作树应该与合并的结果相同:

[other history]   [ "changeset 1" ]
o - o - o - o - o ( - o - o - o - o)
 \               \
  \               ------
   \                    \
   (o - o - o - o - o) - X
    [ "changeset 2" ]

因此,您可以执行临时合并,并将结果提交与另一个变更集的结束提交进行比较。这将比重新设置基础快得多。(无论如何,您当然会使用一次性分支,而不是变更集2的真正分支。)

也许
diff以下是我比较两个变更集的方法:

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
命令的结果为空,则变更集相同。否则,您将看到这两个差异之间的差异。

展开对的回答:

要比较两次提交引入的变更集,请执行以下操作:

diff <(git show -U0 <sha-A>) <(git show -U0 <sha-B>)

diff我认为这不是OP想要的。看看它的等价物——它实际上与
A
上的更改没有任何关系;它只是用它来寻找差异的起点。这确实不是我需要的。这回答了如何比较两次提交(或修订)之间项目内容的差异。我想知道一个(或多个)提交如何更改内容(=变更集),并将其与一个(或多个)其他提交的变更集进行比较。这有点刺耳,但有一个答案是尝试永远不需要这样做。如果您确实有两个相似但不完全相同的变更集,那么它们应该从一个合理的共同祖先开始,这样您就可以对它们进行区分。如果你选择/重定基址,希望你不会在这个过程中修改变更集,所以没有什么区别;如果不能做到这一点,那么如果你以后修改移植的版本,你应该能够在原始移植和新移植之间进行区分。这确实很糟糕。我不需要经常这样做。然而,分支经常被重定基(交互+非交互)。因此,作为一个非常小的团队的集成商,我想知道重定基础的分支是否仍然包含相同的变更集,或者看看变更集中发生了什么变化。当然,另一件事是,如果你在寻找是或否,你可以简单地生成两个变更集的组合差异,并对其进行差异。可能已经足够好了。我刚刚找到了其他接近你想要的方法。最后的图表是一个非常好的主意。只要不存在需要解决的冲突,对我的团队来说,第二个图表就像其他开发人员做的一样。@Paul:这里的部分想法是,如果存在需要解决的冲突,那么它们本质上就是构建两个变更集之间差异的一部分。也许如果您这样想的话:您想要的是两个端提交之间的差异,删除“其他历史记录”产生的所有差异。将这些差异与变更集1的差异分离等同于解决冲突。它非常适合于比较两个单一提交的变更集,但不适用于一组变更集。上面的代码可以在linux上运行,但不能在msysgit的git bash上运行。不过,我可以在gui difftool中编写一个脚本来比较这两个变更集。能够做这样的事情就是为什么我喜欢cygwin git而不是msysgit。
diff <(git show -U0 <sha-A>) <(git show -U0 <sha-B>)
diff <(git show -U0 <sha-A>...<sha-B>) <(git show -U0 <sha-C>...<sha-D>)