Git - 有些文件被标记为已更改,但是'git diff'没有显示任何内容

42

我对Git还很陌生,可能我在这里漏掉了什么。

dan@one:/var/www/$ git status -s
M  GoogleChromeExtension.js
M  ApiClient.js

显然有两个文件被改变了。
但是当我运行:

git diff

没有输出显示。我原本期望能够看到我的工作副本和最新提交之间的更改。

我很确定昨天一切都按照预期工作......

这可能是因为我还没有将更改推送到远程服务器吗?

P.S.:我正在使用GitHub

谢谢,


2
请添加 "git status" 的输出,但不要包含 "-s"。 - jcollie
我有完全相反的问题 - 即使只更改了几行代码,整个文件也会在git diff中显示出来。感觉这是一个IDE问题(使用Intelli J)。有什么指针吗? - R11G
6个回答

73

执行git diff --cached命令-它比较HEAD和索引(即为提交添加的内容)。

git diff命令只在索引和工作目录之间进行比较,因此如果所有更改都已准备好提交,您将在git diff中看不到任何内容。

第三种形式是git diff <commit>命令,它比较工作目录和提交。因此,执行git diff HEAD命令也会给您所需的差异。


4
请注意,从git-status的输出中可以看出文件修改已经被加入到了索引中,因为'M'出现在第一列。如果更改没有被暂存,'M'将会出现在第二列。 - William Pursell
@William Pursell - 好观点。此外,如果启用了彩色输出,则前者具有绿色的M,而后者具有红色的M。至少在我在Windows上的git bash中是这样的。因此,仅拥有 git status 并不完全必要,但是如果您知道该看哪里,git status -s 也可以非常信息丰富。 - manojlds
1
git status -s 主要是为机器消费而设计的;计算机通常比我们更擅长注意 M 在哪一列。(而我们更擅长阅读颜色。) - Cascabel
1
@Jefromi - 我明白你的意思,但对于有经验的 Git 用户来说,“git status -s” 可能非常有用。 - manojlds
真的 - 它绝对非常可用,特别是有颜色的情况下,但我会说,大多数询问和阅读这类问题的人可能已经到了需要更多上下文的地步。 - Cascabel
你所描述的情况可能是最常见的,但我想让你知道:我曾经遇到这样的情况,即使 git diffgit diff --cached 都没有显示任何更改,但一个文件被列为未暂存的更改。在仔细检查了没有更改后,我执行了 git checkout <filename> 命令来消除这个虚假的更改。 - Nobody moving away from SE

4
使用 --no-pager 标志与差异(diff)命令一起使用。
git --no-pager diff filepath/filename.extn

4
根据具体情况,可能有两种解决方案。为了便于调试,请不要使用短模式,因为它会隐藏重要的信息。
如果您期望有更改,可以尝试运行git diff HEAD命令,将工作目录与上次提交进行比较。如果您已经使用了git add命令添加了更改,则默认的git diff操作将不显示这些差异。请参阅http://git-scm.com/docs/git-diff man页面上的描述。而git status输出(没有-s选项)将有助于大家了解是否是这种情况。
或者,如果您没有预料到更改,那么这可能是操作系统/文件系统问题。请报告您的操作系统和文件系统信息。

2

请确保您不在另一个git仓库中。 如果以上命令无法正常运行,请尝试运行以下命令:

git show HEAD

0

git diff不能显示最后两个提交之间的差异。 git diff会显示最后一次提交和您对代码所做的更改之间的差异。


0
我最近遇到了这个问题,发现是因为我更改了存储库的.gitattributes文件。你最近更改过任何.gitattributes文件吗?所有更改的文件都是相同类型的吗?例如,我的最近问题影响了*.sql文件。当我撤消对.gitattributes的更改时,源文件再次变为未更改状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接