我如何在git中要求完整的分支差异?

时间:2017-02-17 18:19:48

标签: git

我的目标是在git中获得整个分支的整个差异。如果我的分支名为foo/bar,那么适当的命令(即git diff的args,我认为是什么)可以看到整个差异? (这个分支从其他分支收到了许多不同的合并)。

编辑:也许我对整个分支差异的要求不是那么清楚,但我的意思是进行两次提交:

  1. 分支的最后一次提交。
  2. 分支的父提交。
  3. 我需要将这两个参数传递给git diff命令。有没有 - 快捷方式来指定两个提交?

2 个答案:

答案 0 :(得分:1)

diff ...与什么相比?

没有分支" diff的分支"。只有提交的差异。 1 选择任意两个提交,你可以比较它们。但是一个分支......好吧,看What exactly do we mean by "branch"?分支不是两个提交。分支名称可以选择一个提交,或者您可以使用分支名称和其他内容来选择许多提交。但是一次提交是不够的,许多提交太多了。您必须准确选择两个提交。

请注意,git diff branch1 branch2git diff branch1..branch2意味着完全相同:将名称branch1翻译为一个特定提交,并翻译名称{{1}到一个特定的提交,然后区分这两个特定的提交。再次,请参阅What exactly do we mean by "branch"?

1 您还可以针对工作树或针对索引区分提交;并且您可以将索引与工作树区分开来。除了这些之外,还有一些特殊形式的差异来查看一个文件,甚至是一个Git存储库之外的文件;你可以让Git计算几个不同的差异,然后将它们组合成一个组合差异。但是,组合diff只能用于合并提交,并且会针对每个父级区分最终的合并结果。它对于查看许多任意提交没有用,仅用于检查合并的最终结果。

编辑后

你或许可以得到你想要的东西 - 但是真的没有"父母提交的分支"无论是。例如,考虑一下这个图片段:

branch2

每个分支的最新提交是最右边的...--o--A--o--o--o <-- br1 \ o--B--o <-- br2 \ o--o <-- feature ,每个提交都连接回早期的父提交。 (这些连接在内部存储为那些丑陋的SHA-1哈希ID,每次提交都保存其父ID。父母不认识他们的孩子,因为孩子们在父母制作时还不存在,一旦做好,就不能改变任何承诺。所以孩子们都知道他们的父母,但反之亦然。)

什么是&#34;父母&#34;提交o?是提交feature还是提交A? (它可能任何剩余的提交,这就是为什么我只给这两个提供特定的单字母名称。)或者:

B

此处...--A--o--o--B--o--C--o <-- devel \ / / o----o--o--D--E--F <-- feat 已在featdevel点重复进入B。它可以再次被带入;如果是这样,那将引入CE相对于F的更改。但是从这张图表中可以看出,D最初&#34;是从&#34;提交feat,您想要的父级是A,还是与AB更相关?如果它不是C,则会出现问题,因为Git不会在任何地方独立记录CA(它不记录{{ 1}}独立,但我们有一个简单的方法来查找,好吧,不是B而是C;但C也许就是你想要的)。此外,虽然似乎很明显D是起点,但这只是因为我画了这个图片段的方式。一个不同的观点可能会同样清楚地表明,有一个更早的起点 - 事实上,它并不是一个真实的起点......#34;除非你专门记录一个(标签是这个目的的理想选择)。

合并基础:如何在第一个图表中找到DA,在第二个图表中找到A

Git支持 - 因为它必须,因为B需要它 - 合并基础的概念。两个提交的合并基础很简单(ish),看你是否像我们上面那样绘制提交图。提交通常是两个不同的分支提示(如果没有,我们只是假装它们)。您只需从每个尖端开始,然后向左/向后跟随其连接线。最终,这需要&#34;见面&#34;在一些共同的提交。这是这两个分支的第一次提交,而提交是合并基础

这是第一张图:

D

git merge 的提示开始,...--o--A--o--o--o <-- br1 \ o--B--o <-- br2 \ o--o <-- feature 的提示开始,检查您是否有共同的提交。不,回头看一下。回顾feature,在提交br1时会出现问题。我们可以从br1提交A吗?是的:我们从A的小费开始,然后返回两步到feature,然后返回两个步骤feature。这是第一次共享提交 - 第一次提交 B A。这就是合并基础。

br1feature的合并基础同样是提交br1br2A的合并基础是提交br2 。因此,给定两个分支名称 - 或者甚至只有两个提交ID - 我们可以找到它们的合并基础。

第二张图的合并基础比较棘手。提交feature合并提交。这意味着它有两个父箭头,一个是仅在分支B上的提交,另一个是在C上提交devel。 (顺便说一句,这意味着我们在之前提交了D 我们提交了feat。这里的图表字母有点误导!抱歉。)从D的提示做出提交C 可到达,以便提交D在两个分支上 - 以及它的&#34;最接近&# 34; -ness to branch tips,使提交devel成为DD的合并基础。

devel

命令feat将找到两个命名分支的合并基础。理想情况下,这将是一个提交ID。 (它可能是 no ID,如果这两个分支没有任何共同点 - 它们具有不相关的历史记录;这种情况很少 - 或者可能存在多个合并基础,在这种情况下{{1}只是选择一个,有点随意。但是,很难获得多个合并基础,所以通常你不必担心这个。)

因此,如果此时的目标是在第二个图中找到提交git merge-base,并将其与git merge-base A B的提示进行区分,则可以执行以下操作:

git merge-base

因为想要这是一个相对常见的事情,D内置了它。它的语法借用了每隔一个 Git命令意味着别的东西:

feat

注意两个名字之间的三个(不是两个)点。对于git merge-base devel feat # and note the commit ID git diff <hash> feat ,仅{<1​​>}的 ,这意味着&#34;找到这两个分支提示之间的合并基础,然后针对第二次提交进行区分。 #34;

使用第一个图表,您可以选择git diffgit diff devel...feat 来查找git diffgit diff,然后将其与br1的提示进行比较:< / p>

br2
例如

答案 1 :(得分:1)

只需git diff commit_hash1 commit_hash2

其中commit_hash1是分支上第一次提交的父级的哈希值(请注意,它不是分支的一部分),commit_hash2是分支的头部(提交,您的分支机构目前指向)。