git status显示已更改的文件,但git diff没有

时间:2013-01-28 15:10:07

标签: git diff

我已经查看了所有类似的问题但是我已经仔细检查了一些奇怪的事情肯定会发生。

在一台服务器(带有git 1.8.1的Solaris)上,我克隆了git存储库,然后将.git文件夹复制到现有的实时文件中。这很完美,我可以运行

git status

然后

git diff [filename]

检查任何不同的文件。

在另一台服务器上(带有git 1.7.6的Solaris)我正在做同样的事情

git diff [filename] 
即使文件的内容肯定不同,

也不显示任何内容。我还测试了添加一个新文件,然后进行编辑。同样的问题,git status显示文件已更改,但git diff未显示任何内容。如果我下载更改的文件并在本地运行差异,那么我得到差异输出。

15 个答案:

答案 0 :(得分:63)

我将文件添加到index

git add file_name

然后跑了:

git diff --cached file_name

你可以看到git diff here的描述。

如果您需要撤消git add,请参阅此处:How to undo 'git add' before commit?

答案 1 :(得分:50)

git status可能会显示差异但git diff可能没有差异的原因有几个。

  • 文件的模式(权限位)已更改 - 例如,从777更改为700.

  • 换行方式从CRLF(DOS)更改为LF(UNIX)

找出所发生情况的最简单方法是运行git format-patch HEAD^并查看生成的补丁所说的内容。

答案 2 :(得分:41)

对我而言,它与文件权限有关。 在我的项目中使用Mac / Linux的人似乎提交了一些具有非默认权限的文件,而我的Windows git客户端无法重现这些权限。 我的解决方案是告诉git忽略文件权限:

git config core.fileMode false

其他见解:How do I make Git ignore file mode (chmod) changes?

答案 3 :(得分:30)

我遇到了一个问题,其中一些程序修改了数百行结尾,git diff将所有源文件列为已更改。修复行结尾后,git status仍然将文件列为已修改。

我能够通过将所有文件添加到索引然后重置索引来解决此问题。

git add -A
git reset

core.filemode设置为false。

答案 4 :(得分:17)

我怀疑你的git安装或你的存储库有问题。

尝试跑步:

GIT_TRACE=2 git <command>

看看你是否有任何有用的东西。如果这没有帮助,只需看看出现了什么问题:

strace git <command>

答案 5 :(得分:10)

我遇到了类似的问题:git diff会显示差异,但git diff <filename>则不会。事实证明,我将LESS设置为包含-F--quit-if-one-screen)的字符串。删除该标志解决了这个问题。

答案 6 :(得分:5)

陷入这个问题。我的案例类似于@rcwxok发布的LESS问题。

就我而言,我将PAGER环境变量设置为PAGER='less -RSF'

然而,与之前的答案不同,我不想删除-F选项,因为我明确地将其放在那里希望阻止在less中显示差异,如果它比屏幕更短。< / p>

为了获得所需的结果,我添加了-F-X,而不是删除PAGER='less -RSFX'。这既解决了git diff问题,又防止了less显示短差异。

希望这有助于某人。

答案 7 :(得分:4)

简答

运行git add有时会有所帮助。

实施例

Git状态显示已更改的文件,git diff没有显示任何内容......

> git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   package.json

no changes added to commit (use "git add" and/or "git commit -a")
> git diff
> 

...运行git add解决了不一致问题。

> git add
> git status
On branch master
nothing to commit, working directory clean
> 

答案 8 :(得分:3)

我刚刚遇到过类似的问题。 git diff file没有显示任何内容,因为我将文件添加到git索引中,其中某些部分名称为大写:GeoJSONContainer.js。之后,我已将其重命名为GeoJsonContainer.js,并且已停止跟踪更改。 git diff GeoJsonContainer.js没有显示任何内容。不得不用强制标志从索引中删除文件,然后再次添加文件:

git rm -f GeoJSONContainer.js 
git add GeoJSONContainer.js

答案 9 :(得分:2)

你并没有真正提出一个实际问题,但由于这是一个一般用例,我经常使用这里是我的工作。您可以自己尝试一下,看看错误是否仍然存在。

我对您的用例的假设: 您有一个包含文件和目录的现有目录,现在想要将其转换为git存储库,该存储库是从其他地方克隆而不用更改当前目录中的任何数据。

实际上有两种方式。

克隆回购 - .git - git reset --hard

此方法就是您所做的 - 将现有仓库克隆为空目录,然后将.git目录移动到目标目录中。为了顺利工作,通常需要您运行

git reset --hard

但是,这会改变当前目录中的文件状态。您可以在目录的完整副本/ rsync上尝试此操作并研究更改。至少在此之后,您不应再看到git logstatus之间的差异。

初始化新回购 - 指向原点

第二个不那么令人不安:cd进入你的目的地,并用

开始一个新的回购
git init

然后你告诉那个新的回购,它有一个地方的祖先:

git remote add origin original_git_repo_path

然后安全

git fetch origin master

复制数据而不更改本地文件。现在一切都很好。

我总是建议第二种方式,以减少错误。

答案 10 :(得分:1)

我有以下方式描述的同样问题: 如果我输入

$ git diff 

git只返回提示,没有错误。

如果我输入

$ git diff <filename>

git只返回提示,没有错误。

最后,通过阅读我注意到git diff实际上调用mingw64 \ bin \ diff.exe来完成工作。

这是交易。我正在运行Windows并安装了另一个bash实用程序,它改变了我的路径,因此它不再指向我的 mingw64 \ bin 目录。

所以如果你输入: git diff 它只是返回提示您可能遇到此问题。

  

git运行的实际diff.exe位于你的mingw64 \ bin中   目录

最后,为了解决这个问题,我实际上将我的mingw64 \ bin目录复制到了git正在查找的位置。我试了一下它仍然没有用。

然后,我关闭了我的git bash窗口并再次打开它去了我失败的同一个仓库,现在它正常工作。

希望这对你也有帮助。

答案 11 :(得分:1)

我再次偶然发现了这个问题。但这一次出现的原因不同。 我已将文件复制到repo中以覆盖以前的版本。现在我可以看到文件被修改但是diff不会返回差异。

例如,我有一个mainpage.xaml文件。 在文件资源管理器中,我将新的mainpage.xaml文件粘贴到当前仓库中的文件上。 我在另一台机器上完成了工作,只是将文件粘贴在这里 git shows modified

文件显示已修改,但是当我运行git diff时,它不会显示更改。 这可能是因为文件上的fileinfo已经改变,git知道它实际上并不是同一个文件。有趣。

git diff shows nothing

你可以看到,当我在文件上运行diff时它什么都没显示,只返回提示符。

答案 12 :(得分:1)

正如已经above所述,这种情况可能是由于行尾问题(CRLF与LF)引起的。我使用以下命令解决了这个问题(在git版本2.22.0下):

git add --renormalize .

根据手册:

       --renormalize
           Apply the "clean" process freshly to all tracked files to
           forcibly add them again to the index. This is useful after
           changing core.autocrlf configuration or the text attribute in
           order to correct files added with wrong CRLF/LF line endings.
           This option implies -u.

答案 13 :(得分:0)

git diff -a将所有文件视为文本,对我有用。

答案 14 :(得分:0)

我使用了[] [1] [2, 1] ,并且对于一个文件有此问题。对于文件的每个祖先使用git svn,我注意到一个文件有2个子文件夹-ls-treeSubmit。由于我使用的是Windows,因此无法将它们都检出,从而导致此问题。

解决方案是直接从submit TortoiseSVN中删除其中一个,然后先运行Repo-browser,然后运行git svn fetch