以一个具有以下历史图表的示例repo为例:
$ git log --all --graph --oneline
* 691d454 (HEAD -> branch-b) branch-b-2
* c3bd488 branch-b
| * f5756ff (branch-a) branch-a-2
| * de00ec4 branch-a
|/
* 5ad3b15 (root) root
现在,比较
git diff branch-a..branch-b
。diff --git a/f b/f
index af31a64..e7791f3 100644
--- a/f
+++ b/f
@@ -1 +1 @@
-branch-a-2
+branch-b-2
使用git diff branch-a...branch-b
命令
diff --git a/f b/f
index d8649da..e7791f3 100644
--- a/f
+++ b/f
@@ -1 +1 @@
-root
+branch-b-2
使用 git log --oneline branch-a..branch-b
命令
691d454 (HEAD -> branch-b) branch-b-2
c3bd488 branch-b
使用 git log --oneline branch-a...branch-b
命令
691d454 (HEAD -> branch-b) branch-b-2
c3bd488 branch-b
de00ec4 branch-a
f5756ff (branch-a) branch-a-2
基本上,我们看到这个:
|------+--------------------------------------+--------------------------------------|
| | branch-a..branch-b | branch-a...branch-b |
|------+--------------------------------------+--------------------------------------|
| log | root -> branch-b | branch-a -> branch-b |
| | (root, branch-b] | [branch-a, branch-b] |
| | changes introduced in branch-b | difference from branch-a to branch-b |
|------+--------------------------------------+--------------------------------------|
| diff | branch-a -> branch-b | root -> branch-b |
| | [branch-a, branch-b] | (root, branch-b] |
| | difference from branch-a to branch-b | changes introduced in branch-b |
|------+--------------------------------------+--------------------------------------|
这意味着,如果您想查看从主分支派生出的分支中所做的更改作为提交列表,
git log master..branch
将显示给您。但是,如果您想将这些相同的更改作为合并这些提交的差异来查看,则必须切换到 ...
,如此操作:git diff master...branch
。我经常发现自己在做这件事情,因此这是一个我一直想知道的小问题。这是否存在设计原因?它似乎只是不一致性。
编辑:为了澄清,我知道在diff
和log
中..
和...
的翻译分别是什么。我的问题可以重新表述为:是否更合理地将它们中的任何一个翻转,以使它们彼此一致?例如,如果git diff branch-a..branch-b
意味着git diff $(git merge-base branch-a branch-b) branch-b
,而git diff branch-a...branch-b
意味着git diff branch-a branch-b
,那么diff
就与log
一致。那么,为什么不是这种情况?
编辑2:在表格下面的段落中,我举了一个实际的例子,说明了git diff master...branch
是git log master..branch
的类比。对于另一种情况,如果您想获得将master
与branch
分开的提交列表(即表示两者之间差异的提交),则应使用git log master...branch
,如果您想要表示相同差异的diff,则应使用git diff master..branch
。
编辑3:我尝试使表格更清晰。使用括号和圆括号是数学区间符号。
编辑4:调整了表格的位置,以便更好地适应。
log branch-a..branch-b
的结果是root -> branch-b
?(也就是说,我在输出中没有看到5ad3b15
) - anthony sottileroot
到branch-b
的提交,但不包括branch-a
的更改。如果branch-b
有更多的提交,它们也会出现;所有从root
到branch-b
的提交都不包括根节点。这也与使用...
的diff
相一致,因为它不包括5ad3b15
的更改,否则您将看不到删除root
行,只能看到向以前不存在的文件添加branch-b
行。 - JoL