当我跑步时
git diff-tree --no-commit-id --name-only -r HEAD
在分支上返回上次提交时修改的文件名。
但是当我在master分支上运行相同的命令时,它什么都不返回。
阅读
git help diff-tree
尚未澄清此行为。它说该命令比较一个或几个树。如果只指定了一个,则将其与父母进行比较。
主人:
$ git diff-tree --name-only -r HEAD
$ git diff-tree --name-only -r HEAD HEAD^
path/to/modified-file
$
为什么在master上运行此命令什么都不返回?
答案 0 :(得分:1)
如果当前提交是合并提交(有两个或更多父母),那么:
git diff-tree --name-only -r HEAD
表示:
git diff-tree --name-only -r HEAD HEAD^1 HEAD^2
(如果它是章鱼合并,则添加更多HEAD^number
个参数,或者使用特殊的^@
表示法一次命名所有父项;上述内容主要用于说明。)
由于这会比较多个树,因此它使用组合差异(或使用--stdin
,默认情况下根本不会产生差异)。正如the documentation says:
请注意,组合差异仅列出从所有父母修改的文件
(强调我的)。如果子(合并)提交的path/to/modified-file
版本与父#1中的文件不同,但与父#2中的文件匹配,则不会看到该文件的名称。
请注意,-m
标志将拆分合并为多个虚拟提交,每个虚拟提交都有一个父提交,然后列出与该父提交的差异。然而,将此与--no-commit-id
相结合意味着更难以确定哪个父项具有哪些与合并提交相关的更改(尽管如果某个文件被列出两次,并且合并提交只有两个父母,你马上就可以告诉父母双方都改变了。)