我的猜测是,1990ca669fe和00de228dcdc有不同的历史(两者都不可从其他地方到达)。您可能希望此命令(三个点,而不是两个):
git log 1990ca669fe...00de228dcdc -- t/tests.conf
它将显示提交从历史(而不仅仅是导致00de228dcdc的提交)的两侧。
简而言之:
要查看“东西”从两侧(A和B),可使用git diff A..B
和git log A...B
。
要仅从第二面(B)获得“材料”,请使用git diff A...B
和git log A..B
。
这是一个相当不幸的UI疣。 “日志”命令是关于查看历史图(提交“范围”或提交集)的命令。
他们将A..B
解释为等于B --not A
(即可从B到达而不从A到达的提交集合)。 A...B
相当于A B --not $(git merge-base --all A B)
(即,由于它们发散而来自双方的提交集合;这被称为“A和B的对称差异”)。
“diff”命令是关于比较两个特定的树或blob(只是“端点”,(大部分)不是关于任何可能连接它们的历史记录)。他们将A..B
解释为等同于A B
(即直接指定差异操作的端点的另一种方式)。 A...B
相当于
$(git merge-base A B)..B
或$(git merge-base A B) B
(这是历史意识,因此“主要”在上面)。
从git-diff(1):
“差异” 是关于比较两个端点,没有范围,该范围符号( “<提交> .. <提交>” 和“<提交> ... < commit>“并不意味着在gitrevisions(7)的”指定范围“部分中定义的范围。
让我们考虑git log A..B
和git diff A..B
为两种不同的历史。
如果A和B是线性相关的(如下所示),
---1---2---A---3---4---B
,那么你将看到类似的输出两种类型的命令。 git log A..B
将显示提交3,4和B. git diff A..B
将显示提交A和B引用的树之间的差异;这个差异将相当于累积由提交3,4和B表示的补丁。
由于A和B的合并基础本身是A,所以三点版本不感兴趣。对于“日志”命令,A...B
意味着A B --not $(git merge-base --all A B)
,其结果是
A B --not A
,这意味着B --not A
,它与A..B
相同。对于“diff”命令,A...B
意味着$(git merge-base A B)..B
,最终结果为A..B
。
然而,如果A和B具有不同的历史(既不是来自其它可到达的;下面示出),
---1---D---3---4---A
\
5---6---B
则DIFF将包括来自两个支路的变化,而该日志将只显示取得的提交到其中一个分支。 git log A..B
将显示提交5,6和A. git diff A..B
将显示提交A和B引用的树之间的差异;此差异将包括由提交5,6和B以及3,4和A代表的补丁。
在这种情况下,三点变体很有趣。对于“日志”命令,A...B
意味着
A B --not $(git merge-base --all A B)
,其结束意味着A B --not D
,它最终扩展到集3,4,A,5,6,B(即从A或B但不是两个可达的提交) 。对于“差异”命令,A...B
表示$(git merge-base A B)..B
,其结果为D..B
(即,由于B偏离A而在“B侧”进行的所有改变)。
这是一个艰难的坚果要破解。我也很惊讶。等待VonC清理:D – ralphtheninja 2011-05-02 23:21:22
ha ..很高兴我并不孤单。这有点让我疯狂。 – 2011-05-03 00:32:55
@Magnus @Tyrone我怀疑是因为'..'的含义,它可能在diff-tree和log之间有所不同:请参阅http://stackoverflow.com/questions/2539040/not-able-to-think-of- a-case-where-git-diff-master-lab-and-git-diff-master-lab或http://stackoverflow.com/questions/850607/difference-in-git-log-origin-master-vs- git-log-origin-master – VonC 2011-05-03 02:26:08