2011-05-02 145 views
4

git diff-tree表示文件已被删除,但是当我运行git log时,它不显示任何内容。git diff-tree显示删除但没有删除git日志

机智:

> git diff-tree --stat --summary 1990ca669fe..00de228dcdc -- t/tests.conf 
t/tests.conf | 9 --------- 
1 files changed, 0 insertions(+), 9 deletions(-) 
delete mode 100644 t/tests.conf 

当我运行:

> git log 1990ca669fe..00de228dcdc -- t/tests.conf 

我没有得到任何输出。

任何想法我如何我可以追查为什么git认为这个文件已被删除,因为它也导致合并问题我试图?

更新

这不会产生任何输出两种:

> git log 1990ca669fe...00de228dcdc -- t/tests.conf 

而且提交可达:

> git rev-list 00de228dcdc | grep 1990ca669fe 
    1990ca669fe9ec94d215945388458daba8d94747 
+0

这是一个艰难的坚果要破解。我也很惊讶。等待VonC清理:D – ralphtheninja 2011-05-02 23:21:22

+0

ha ..很高兴我并不孤单。这有点让我疯狂。 – 2011-05-03 00:32:55

+0

@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

回答

8

我的猜测是,1990ca669fe和00de228dcdc有不同的历史(两者都不可从其他地方到达)。您可能希望此命令(三个点,而不是两个):

git log 1990ca669fe...00de228dcdc -- t/tests.conf 

它将显示提交从历史(而不仅仅是导致00de228dcdc的提交)的两侧。

简而言之:
要查看“东西”从两侧(A和B),可使用git diff A..Bgit log A...B
要仅从第二面(B)获得“材料”,请使用git diff A...Bgit 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..Bgit 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侧”进行的所有改变)。

+0

晶莹剔透:'“diff”是关于比较两个端点,而不是范围和范围符号(“,”和“” ... “)并不意味着一个范围 - 灿烂的解释Chris – sehe 2011-05-03 05:54:21

+0

谢谢。这是一个很好的答案,所以我投了票。不幸的是,git log中的三重点也不会产生任何输出。我的回购中存在一些奇怪的现象。我认为罪魁祸首是一个恢复合并,但我不能看到t/tests.conf实际上被删除的日志中的任何东西,所以我很困惑,为什么git认为这是删除,当我对这些提交进行比较时。 – 2011-05-03 18:52:29