15

Git 可以很容易地比较提交之间的差异,例如使用 git 命令 diff 和 difftool。同样在 TortoiseGit 中,您只需选择两个提交来比较它们。

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

这对于比较精选或已重新设置的(一组)提交非常方便。

4

5 回答 5

14

也许diff <(git show rev1) <(git show rev2)会做你想做的事?

于 2011-02-18T10:06:16.510 回答
5

我认为通常要获得您想要的东西,您必须进行某种合并/变基操作才能创建一些可比较的东西。

当您真正考虑它时,变更集之间差异的想法是模糊的。我在这里假设您处于这样的情况:

[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'" ]

然而,变基并不总是最有趣的,我可以想出一个解决这个问题的小方法。假设您适当地解决了冲突,rebase 的结果工作树应该与合并的结果相同:

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

因此,您可以执行该临时合并,并将生成的提交与另一个变更集的最终提交进行比较。这将比做 rebase 快得多。(无论哪种方式,您当然会使用一次性分支,而不是变更集 2 的真正分支。)

于 2011-02-18T06:51:30.723 回答
1

扩展jeff-bradberry的答案:

比较两个单一提交引入的变更集:

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

注意:-U0是为了避免比较“上下文”行(即围绕您的编辑更改的行,但不是直接由它们更改)。

于 2020-05-27T05:36:55.253 回答
1

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

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

于 2016-12-17T14:56:43.523 回答
-2
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 --all 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.

那对你有用吗?

于 2011-02-17T23:00:02.087 回答