Git状态显示更改的文件,但Git Diff不显示

git status shows changed files but git diff doesn't

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

在一台服务器(带有git 1.8.1的Solaris)上,我克隆了git存储库,然后将.git文件夹复制到现有的Live文件中。这个很好用,我可以跑了

1
git status

然后

1
git diff [filename]

检查任何不同的文件。

但在另一台服务器上(使用git 1.7.6的Solaris),我做的完全一样。

1
git diff [filename]

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


我将文件添加到索引:

1
git add file_name

然后跑:

1
git diff --cached file_name

您可以在这里看到gitdiff的描述。

如果您需要撤消git添加,那么请参见以下内容:如何在提交之前撤消"git添加"?


git status可能有一些不同的原因,但git diff可能没有。

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

  • 换行样式从crlf(dos)改为lf(unix)

最简单的方法是运行git format-patch HEAD^并查看生成的补丁的内容。


对我来说,这与文件权限有关。我的项目中有一个Mac/Linux的用户似乎提交了一些非默认权限的文件,而我的Windows Git客户端无法复制这些文件。我的解决方案是告诉Git忽略文件权限:

1
git config core.fileMode false

其他见解:如何使git忽略文件模式(chmod)更改?


我遇到了一个问题,一些程序修改了数百个行尾,gitdiff列出了所有更改后的源文件。在修复了行尾之后,git status仍然列出了修改后的文件。

我可以通过将所有文件添加到索引,然后重置索引来解决这个问题。

1
2
git add -A
git reset

core.filemode设为假。


我怀疑您的Git安装或存储库有问题。

试运行:

1
GIT_TRACE=2 git <command>

看看有没有什么有用的。如果这不起作用,就走着瞧到底出了什么问题:

1
strace git <command>


我有一个类似的问题:git diff会显示出差异,但git diff 不会。结果我把LESS设置为一个字符串,包括-F(--quit-if-one-screen)。删除那个标志解决了问题。


遇到这个问题。我的案例类似于@rcwxok发布的LESS期。

在我的例子中,我将PAGER环境变量设置为PAGER='less -RSF'

但是,与前面的答案不同,我不想删除-F选项,因为我明确地将它放在那里,希望避免显示LESS中的差异(如果它比屏幕短)。

为了得到预期的结果,我没有删除-F,而是添加了-XPAGER='less -RSFX'。这两者都解决了git diff的问题,而且还防止了与LESS之间的短期差异。

希望这能帮助别人。


简短回答

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

例子

Git状态显示已更改的文件,而Git Diff未显示任何内容…

1
2
3
4
5
6
7
8
9
10
11
> 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可以解决不一致性。

1
2
3
4
5
> git add
> git status
On branch master
nothing to commit, working directory clean
>


我也遇到过类似的问题。git diff file没有显示任何内容,因为我在git索引中添加了文件,文件名的某些部分大写:GeoJSONContainer.js。后来,我把它改名为GeoJSONContainer.js,更改不再被跟踪。git diff GeoJsonContainer.js什么也没显示。必须从索引中删除带有强制标志的文件,然后再次添加该文件:

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

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

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

有两种方法。

clone repo-mv .gitgit reset--硬

这个方法就是您所做的——将现有的repo克隆到一个空目录中,然后将.git目录移到目标目录中。要无问题地工作,通常需要运行

1
git reset --hard

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

初始新回购-指向原点

第二个不那么令人不安:CD进入你的目的地,开始一个新的回购

1
git init

然后你告诉新回购,它在其他地方有一个祖先:

1
git remote add origin original_git_repo_path

然后安全

1
git fetch origin master

在不更改本地文件的情况下复制数据。现在一切都会好起来的。

我总是推荐第二种方法来减少错误的发生。


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

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

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

git diff shows nothing

您可以看到,当我对文件运行diff时,它不显示任何内容,只返回提示。


我用以下方式描述了这个问题:如果我打字

1
$ git diff

Git只是返回到提示,没有错误。

如果我打字

1
$ git diff <filename>

Git只是返回到提示,没有错误。

最后,通过阅读,我注意到GitDiff实际上调用mingw64indiff.exe来完成这项工作。

成交了。我正在运行Windows,安装了另一个bash实用程序,它改变了我的路径,因此它不再指向我的mingw64in目录。

所以如果你键入:差异比较它只是返回提示,您可能有这个问题。

The actual diff.exe which is run by git is located in your mingw64\bin
directory

最后,为了解决这个问题,我实际上将mingw64in目录复制到了git正在查找的位置。我试过了,但还是没用。

然后,我关闭了我的GitBash窗口,再次打开它,我的同一个回购失败了,现在它工作了。

希望这对你也有帮助。