Git可以很容易地比较提交之间的差异,例如使用git命令diff和difftool。同样在TortoiseGit中,您只需选择两个提交来比较它们。
但有没有办法比较变更集?换句话说:查看一组提交的差异与另一组提交的差异之间的差异。
这可以非常方便地比较(一组)提交,这些提交是挑选的或已被重新设定的。
答案 0 :(得分:12)
也许diff <(git show rev1) <(git show rev2)
会做你想做的事情?
答案 1 :(得分:5)
我认为一般来说,为了获得你想要的东西,你必须进行某种合并/反转操作才能创造出可以比较的东西。
当你真正想到它时,变更集之间差异的想法是模糊的。我在这里假设你遇到这样的情况:
[other history] [ "changeset 1" ]
o - o - o - o - o ( - o - o - o - o)
\
(o - o - o - o - o)
[ "changeset 2" ]
那么比较这两个是什么意思呢?也许在你的情况下,其他历史中的差异与两个变更集中的差异完全不相交,但一般来说,变更集1的内容可能取决于其他历史记录!这意味着git没有很好的通用方法来执行这样的操作;要做得恰到好处,它必须基本上说“如果我重新定位,两个最终提交之间会有什么区别?”换句话说,我相信变更集之间差异的唯一合理的定义是生成的最终提交之间的差异,如果它们被重新命名为具有共同的祖先。当然,如果这就是你想要的,那么你将不得不在工作树中执行一个操作 - 没有别的方法来处理这样的差异。显而易见的事情是rebase,并比较新的端点(分支):
[other history] [ "changeset 1" ]
o - o - o - o - o ( - o - o - o - o)
\
(o - o - o - o - o)
[ "changeset 2'" ]
然而,Rebases并不总是最有趣的,我可以想出一个解决这个问题的方法。假设您正确解决冲突,生成的rebase工作树应该与合并的结果相同:
[other history] [ "changeset 1" ]
o - o - o - o - o ( - o - o - o - o)
\ \
\ ------
\ \
(o - o - o - o - o) - X
[ "changeset 2" ]
因此,您可以执行该临时合并,并将结果提交与另一个变更集的结束提交进行比较。这比做rebase快得多。 (无论哪种方式,你当然会使用一次性分支,而不是变更集2的真实分支。)
答案 2 :(得分: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
命令的结果为空,则更改集相同。否则你会看到两个差异之间的区别。
答案 3 :(得分:0)
扩展Ian Griffith's blog post的答案:
比较两次单次提交引入的变更集:
PresentationFramework.Classic.dll
比较两个提交序列引入的更改集:
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>)
是为了避免比较“上下文”行(即在您的修改周围已更改但未直接由其更改的行)。
答案 4 :(得分:-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 help:
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.
这对你有用吗?