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] |
即使文件的内容绝对不同,也不显示任何内容。我还测试了添加一个新文件,提交然后编辑。同一问题,
我将文件添加到索引:
1 | git add file_name |
然后跑:
1 | git diff --cached file_name |
您可以在这里看到gitdiff的描述。
如果您需要撤消git添加,那么请参见以下内容:如何在提交之前撤消"git添加"?
文件的模式(权限位)已更改——例如,从777更改为700。
换行样式从crlf(dos)改为lf(unix)
最简单的方法是运行
对我来说,这与文件权限有关。我的项目中有一个Mac/Linux的用户似乎提交了一些非默认权限的文件,而我的Windows Git客户端无法复制这些文件。我的解决方案是告诉Git忽略文件权限:
1 | git config core.fileMode false |
其他见解:如何使git忽略文件模式(chmod)更改?
我遇到了一个问题,一些程序修改了数百个行尾,gitdiff列出了所有更改后的源文件。在修复了行尾之后,git status仍然列出了修改后的文件。
我可以通过将所有文件添加到索引,然后重置索引来解决这个问题。
1 2 | git add -A git reset |
我怀疑您的Git安装或存储库有问题。
试运行:
1 | GIT_TRACE=2 git <command> |
看看有没有什么有用的。如果这不起作用,就走着瞧到底出了什么问题:
1 | strace git <command> |
我有一个类似的问题:
遇到这个问题。我的案例类似于@rcwxok发布的
在我的例子中,我将
但是,与前面的答案不同,我不想删除
为了得到预期的结果,我没有删除
希望这能帮助别人。
简短回答
运行
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 > |
我也遇到过类似的问题。
1 2 | git rm -f GeoJSONContainer.js git add GeoJSONContainer.js |
您并没有真正问一个实际的问题,但是由于这是一个通用的用例,我经常使用这里的功能。您可以自己尝试,看看错误是否仍然存在。
我对您的用例的假设:您有一个包含文件和目录的现有目录,现在希望将其转换为从其他地方克隆的Git存储库,而不更改当前目录中的任何数据。
有两种方法。
clone repo-mv
这个方法就是您所做的——将现有的repo克隆到一个空目录中,然后将
1 | git reset --hard |
但是,这将更改当前目录中文件的状态。您可以在目录的完整副本/rsync上尝试此操作,并研究所做的更改。至少在之后,您应该不再看到
初始新回购-指向原点
第二个不那么令人不安: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中的文件上。我在另一台机器上完成了这项工作,然后把文件粘贴在这里。
文件显示修改,但当我运行gitdiff时,它不会显示更改。这可能是因为文件上的文件信息已经更改,Git知道它实际上不是同一个文件。有趣。
您可以看到,当我对文件运行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窗口,再次打开它,我的同一个回购失败了,现在它工作了。
希望这对你也有帮助。