我的目标是在git中获得整个分支的整个差异。如果我的分支名为foo/bar
,那么适当的命令(即git diff
的args,我认为是什么)可以看到整个差异? (这个分支从其他分支收到了许多不同的合并)。
编辑:也许我对整个分支差异的要求不是那么清楚,但我的意思是进行两次提交:
我需要将这两个参数传递给git diff
命令。有没有 - 快捷方式来指定两个提交?
答案 0 :(得分:1)
没有分支" diff的分支"。只有提交的差异。 1 选择任意两个提交,你可以比较它们。但是一个分支......好吧,看What exactly do we mean by "branch"?分支不是两个提交。分支名称可以选择一个提交,或者您可以使用分支名称和其他内容来选择许多提交。但是一次提交是不够的,许多提交太多了。您必须准确选择两个提交。
请注意,git diff branch1 branch2
和git 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
已在feat
和devel
点重复进入B
。它可以再次被带入;如果是这样,那将引入C
和E
相对于F
的更改。但是从这张图表中可以看出,D
最初&#34;是从&#34;提交feat
,您想要的父级是A
,还是与A
或B
更相关?如果它不是C
,则会出现问题,因为Git不会在任何地方独立记录C
或A
(它不记录{{ 1}}独立,但我们有一个简单的方法来查找,好吧,不是B
而是C
;但C
也许就是你想要的)。此外,虽然似乎很明显D
是起点,但这只是因为我画了这个图片段的方式。一个不同的观点可能会同样清楚地表明,有一个更早的起点 - 事实上,它并不是一个真实的起点......#34;除非你专门记录一个(标签是这个目的的理想选择)。
D
或A
,在第二个图表中找到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
。这就是合并基础。
br1
和feature
的合并基础同样是提交br1
,br2
和A
的合并基础是提交br2
。因此,给定两个分支名称 - 或者甚至只有两个提交ID - 我们可以找到它们的合并基础。
第二张图的合并基础比较棘手。提交feature
是合并提交。这意味着它有两个父箭头,一个是仅在分支B
上的提交,另一个是在C
上提交devel
。 (顺便说一句,这意味着我们在之前提交了D
我们提交了feat
。这里的图表字母有点误导!抱歉。)从D
的提示做出提交C
可到达,以便提交D
在两个分支上 - 以及它的&#34;最接近&# 34; -ness to branch tips,使提交devel
成为D
和D
的合并基础。
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 diff
或git diff devel...feat
来查找git diff
或git diff
,然后将其与br1
的提示进行比较:< / p>
br2
例如。
答案 1 :(得分:1)
只需git diff commit_hash1 commit_hash2
其中commit_hash1
是分支上第一次提交的父级的哈希值(请注意,它不是分支的一部分),commit_hash2
是分支的头部(提交,您的分支机构目前指向)。