我通过从文件source.json
中删除一行来对其进行了更改。我提交了更改(其他文件也更改了)。然后我再次提交。
现在,我想查看我使用source.json
对git diff
所做的更改。
我要做的是:
git diff HEAD^^ -- path/to/source.json
尽管我没有任何输出(命令的退出状态为0)。如果输入git diff HEAD^^
,则可以看到更改source.json
以及所有其他更改的文件。
这是git diff-tree --no-commit-id --name-only -r HEAD^
的输出:
path/to/AboutUs.js
path/to/Contact.js
path/to/source.json
这是git diff HEAD^^
的输出:
diff --git a/path/to/source.json b/path/to/source.json
index 3ba32e950..d86eb9c25 100644
--- a/path/to/source.json
+++ b/path/to/source.json
@@ -565,7 +565,6 @@
- "someContent": "someContent",
"someContent2": "someContent2",
有什么我想念的吗?
答案 0 :(得分:2)
虽然git diff
确实允许路径规范将其输出限制为与该路径规范匹配的文件,但有时有些令人惊讶的是,这些路径规范相对于当前位置在工作树中。
换句话说,如果:
git diff-tree --no-commit-id --name-only -r HEAD^
产生:
path/to/AboutUs.js path/to/Contact.js path/to/source.json
,并且您处于工作树的最高级别,但是请执行以下操作:
cd path/to
您将需要使用:
git diff HEAD^^ -- source.json
最后一个参数实际上表示./source.json
。
或者,在之后:
git rev-parse --show-cdup
打印../..
,您可以执行以下操作:
git -C ../.. diff HEAD^^ -- path/to/source.json
随着-C
将该一个git diff
命令暂时上移两个级别。 (我在脚本和别名中使用了这种通用模式,例如,
git -C "$(git rev-parse --show-cdup)" ls-files --other --exclude-standard
使用一些shell代码来检测未跟踪的文件。
这里的Git并不完全一致。如果要查看在此子目录中的提交source.json
中的HEAD^^
版本,则必须运行:
git show HEAD^^:./source.json
为:
git show HEAD^^:filename
引用存储库顶层中名为filename
的文件-即使您仍在path/to
中。 git show
的窍门尤其是,在commit-specifier之后提供的文件名不是pathspec参数。但是 do 采用路径指定的其他Git命令实际上可以假定为:(toplevel)
。
有关路径规范的更多信息,请参见the gitglossary。