如何比较Git中的变更集?

m3eecexj  于 2022-09-21  发布在  Git
关注(0)|答案(5)|浏览(288)

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

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

这将非常方便地比较精心挑选的或已更改基数的(组)提交。

h7wcgrx3

h7wcgrx31#

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

2vuwiymt

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的真正分支。)

muk1a3rh

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

rsaldnfx

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是为了避免比较“上下文”行(即在您的编辑过程中更改的行,但不是直接由它们更改的行)。

cetgtptt

cetgtptt5#

从2.19开始,我们有了git radge-diff。这正是为了这个目的。

相关问题