Git使得比较提交之间的差异变得非常容易,例如,使用git命令diff和DiffTool。同样,在TortoiseGit中,您只需选择两个提交来比较它们。
但有没有办法比较变更集?换句话说:查看一组提交的差异和另一组提交的差异。
这将非常方便地比较精心挑选的或已更改基数的(组)提交。
h7wcgrx31#
也许diff <(git show rev1) <(git show rev2)会做你想做的事?
diff <(git show rev1) <(git show rev2)
2vuwiymt2#
我认为,一般来说,为了得到你想要的东西,你必须做一些合并/改变基址的操作,以便创建一些可以比较的东西。
仔细想想,变更集之间的区别是模糊的。我在这里假设你处于这样的情况:
[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" ]
这样您就可以执行临时合并,并将结果提交与其他变更集最终提交进行比较。这比改垒要快得多。(无论哪种方式,您当然都将使用一次性分支,而不是用于变更集2的真正分支。)
muk1a3rh3#
下面是我用来比较两个变更集的方法:
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
rsaldnfx4#
对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是为了避免比较“上下文”行(即在您的编辑过程中更改的行,但不是直接由它们更改的行)。
-U0
cetgtptt5#
从2.19开始,我们有了git radge-diff。这正是为了这个目的。
5条答案
按热度按时间h7wcgrx31#
也许
diff <(git show rev1) <(git show rev2)
会做你想做的事?2vuwiymt2#
我认为,一般来说,为了得到你想要的东西,你必须做一些合并/改变基址的操作,以便创建一些可以比较的东西。
仔细想想,变更集之间的区别是模糊的。我在这里假设你处于这样的情况:
那么,将这两者进行比较意味着什么呢?也许在您的情况下,其他历史中的差异与两个变更集的差异是完全不相交的,但总的来说,变更集1的内容可能取决于另一个历史!这意味着git没有很好的通用方法来执行这样的操作;要正确地执行它,它必须基本上说“如果我重新基数,两个最终提交之间的区别是什么?”换句话说,我认为变更集之间的差异的唯一合理的“定义”是,如果它们被重新建立基础以拥有共同的祖先,那么它们之间的差异就是结果最终提交之间的差异。当然,如果这是您想要的,那么您将不得不在工作树中执行一个操作--没有其他方法可以处理这样的差异。最明显的做法是调整基准,并比较新的端点(分支):
不过,改垒并不总是最有趣的,我可以想出一个小方法来解决这个问题。假设您适当地解决了冲突,则得到的Rebase工作树应该与合并的结果相同:
这样您就可以执行临时合并,并将结果提交与其他变更集最终提交进行比较。这比改垒要快得多。(无论哪种方式,您当然都将使用一次性分支,而不是用于变更集2的真正分支。)
muk1a3rh3#
下面是我用来比较两个变更集的方法:
如果
diff
命令的结果为空,则变更集相同。否则,您将看到这两个不同之处。rsaldnfx4#
对jeff-bradberry的答案进行扩展:
要比较由两个单一提交引入的更改集,请执行以下操作:
要比较两个提交序列引入的更改集,请执行以下操作:
注意:
-U0
是为了避免比较“上下文”行(即在您的编辑过程中更改的行,但不是直接由它们更改的行)。cetgtptt5#
从2.19开始,我们有了git radge-diff。这正是为了这个目的。