git diff-tree显示删除但git log中没有删除

时间:2011-05-02 22:45:34

标签: git

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

即便:

> 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

1 个答案:

答案 0 :(得分: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疣。


“log”命令是关于查看历史图表(提交“范围”或提交集) 他们将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(即直接指定diff操作的端点的另一种方式)。 A...B相当于
$(git merge-base A B)..B$(git merge-base A B) B(这是历史感知的,因此上面的“大部分”)。

来自git-diff(1)

  

“diff”是关于比较两个端点,而不是范围和范围符号(“< commit> ..< commit>”和“< commit> ...< 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的一侧”所做的所有更改)。

相关问题