rev-list和diff之间对称/不对称的符号异常

时间:2015-12-17 15:58:18

标签: git git-diff git-log git-rev-list

我试图理解git diffgit rev-listgit log之间的符号差异(如果有的话)。

澄清:

我理解每个命令的作用,正如我在下面解释的那样。我只是在寻找一个解释,为什么Git会在两个不同的命令中使用相同的符号,以便一个直观地(IHO)与另一个相反。

git log / rev-list

在log和rev-list中,当你想要看到分叉的两侧(对称)时,符号是三个点(...)。如,

$ git log --oneline --boundary a...b
* aaaaa Commit to Branch a
| * bbbbb Commit to branch b
|/
o 000000

虽然两个点(..)仅显示右侧(不对称)。如,

$ git log --oneline --boundary a..b
* bbbbb Commit to branch b
o 000000

git diff

然而,使用git diff两个点(..)显示对称差异(我的话),即它显示了列出的两个精确提交之间的差异,例如,

git diff a..b

显示aaaaa和bbbbb树之间的差异。

虽然三个点(...)显示了非对称差异,即它显示了两个提交的合并基础和第二个提交之间的差异。如,

git diff a..b 

显示00000和bbbbb之间的差异。

2 个答案:

答案 0 :(得分:0)

git-log中的点符号指定了一个所谓的修订范围,这正是它的名字所说的,以及你用一个例子描述的内容。使用它是因为git-log的目的是显示提交的列表(范围)。

git-diff也使用修订范围,但如果您让我现在引用:

  

但是,“diff”是关于比较两个端点,而不是范围,而范围符号(“..”和“...”)并不表示gitrevisions中“指定范围”部分中定义的范围[ 7]。

From the documentation for git-diff.

答案 1 :(得分:0)

TL; DR回答: git diff根本不做对称差异(根本不做任何设置)。它只是发现了一对提交,以及配对的差异。

首先(作为一种旁边,为了清楚,以防止各种访问者回答单词"差异","对称差异",与{{1}这个命令主要是无关的),让我在这里注意git diff引用的对称差异the graph-theoretic symmetric difference,即集合联合减去集合交集。在这种情况下,联合和交叉的两个集合是从两个命名提交中的任何一个可以访问的所有提交的集合:git rev-list解析git rev-list a...b以获取提交ID,然后查找所有可以从提交;它同样地解析和处理a;然后交叉点从合并基础本身开始,然后返回历史记录。

在您的示例中,这只留下两个分支提示。您添加了b,导致--boundary包含分支点提交(两个历史记录在集合交集的顶端连接)以获取此信息:

git rev-list

如果没有$ git log --oneline --graph --boundary a...b * aaaaa Commit to Branch a | * bbbbb Commit to branch b |/ o 000000 ,我们就会省略提交--boundary(使o无用)。

您当然也正确使用两个点--oneline --graph,您可以从a..b获得 无法从b访问的提交(通常这是也省略了a本身标识的提交,但a再次将其放回到结果集中。

git diff是不同的

--boundarygit log命令在提交的完整集上运行。例如,如果您正在查看一组75次提交,git rev-list将向您显示所有75次提交(除非您使用git log限制它。)

-n命令不同。它产生两个提交的比较(差异),并且 - 只要我们忽略&#34;组合差异&#34;,它们仅适用于合并提交 - 它将仅 < / em>看看两个提交。给出:

git diff
很明显,这会将提交$ git diff HEAD~5 HEAD 与提交HEAD~5进行比较,但即使HEAD提名5个或更多 1 提交:< / p>
HEAD~5..HEAD

仍然只是将$ git diff HEAD~5..HEAD HEAD~5进行了相同的两次提交。

(注意:

HEAD

比较相同的两个提交,但是告诉您如何修改$ git diff HEAD..HEAD~5 提交以生成HEAD提交,而不是更典型的&#34;如何修改HEAD~5来生成HEAD~5&#34 ;.所以顺序很重要,但基本上,HEAD只是用空格替换两个点,这里。)

git diff命令同样接管三点表示法。因为它仍然只会查看两个提交,当你给它三点符号时,它会像往常一样找到合并库提交,但是然后不是修改输入而是假装你只是单独命名左侧和右侧提交,它会修改输入以假装您在左侧命名为merge-base,在右侧命名为右侧提交。

对于实际的对称差异(设置操作),操作数的顺序是无关紧要的。但是,由于git diff找到一对,然后用合并基替换左操作数,并将其与右操作数相差,这里的顺序很重要:把#&#34;最终结果&#34;在右侧提交名称,因为git diff会将合并基础放在左侧。

git diff生成HEAD~5..HEAD无法从HEAD访问的所有提交。在线性结构中,有五个提交:

HEAD~5

但是,对于branch-and-merge-y结构,此集合中还有其他提交:

... - HEAD~5 - HEAD~4 - HEAD~3 - HEAD~2 - HEAD~1 - HEAD
- excluded -    -------- included: five commits ---------
例如,

这个结构在结果集中有六个提交。