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
答案 0 :(得分:8)
我的猜测是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疣。
“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..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的一侧”所做的所有更改)。