git状态显示已更改的文件,但git diff不

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

在一台服务器上(Solaris with git 1.8.1),我克隆了git仓库,然后将.git文件夹复制到我现有的活动文件中。 这工作完美,我可以运行

git status 

然后

 git diff [filename] 

检查任何不同的文件。

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

 git diff [filename] 

什么都不显示,即使文件内容完全不同。 我也testing添加一个新的文件,提交然后编辑。 同样的问题, git status显示文件已更改,但git diff显示任何内容。 如果我下载更改后的文件并在本地运行diff,则会得到diff输出。

有几个原因为什么git status可能会显示差异,但git diff可能不会。

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

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

找出发生的最简单的方法是运行git format-patch HEAD^并查看生成的补丁说什么。

我将该文件添加到索引 :

 git add file_name 

然后跑:

 git diff --cached file_name 

你可以在这里看到git diff的描述。

如果你需要撤消你的git add,那么请看这里: 如何在提交之前撤销“git add”?

对我来说,这与文件权限有关。 有人在我的项目上的Mac / Linux似乎提交了一些非默认权限的文件,我的Windows git客户端无法重现。 我的解决scheme是告诉git忽略文件权限:

 git config core.fileMode false 

其他见解: 我如何让Git忽略文件模式(chmod)的变化?

我怀疑你的git安装或者你的版本库有问题。

尝试运行:

 GIT_TRACE=2 git <command> 

看看你是否有用。 如果这样做没有帮助,就直截了当地看看出了什么问题:

 strace git <command> 

我有一个类似的问题: git diff会显示差异,但git diff <filename>不会。 事实certificate,我把LESS设置为包括-F (– --quit-if-one-screen )的string。 删除该标志解决了这个问题。

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

我能够解决这个问题,通过添加所有文件索引,然后重置索引。

 git add -A git reset 

core.filemode被设置为false。

跑进这个问题。 我的情况类似于@rcwxok发布的LESS问题。

在我的情况下,我把PAGER环境var设置为PAGER='less -RSF'

然而,与以前的答案不同,我不想删除-F选项,因为我明确地将其放在那里,希望能够避免在比屏幕更短的情况下显示差异。

为了得到所需的结果,而不是删除-F ,我加了-XPAGER='less -RSFX' 。 这既解决了git diff问题,另外它可以防止显示短小的差异。

希望这有助于某人。

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

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

你并没有真正问过一个实际的问题,但是因为这是一个普遍的用例,所以我经常使用这个工具。 你可以自己尝试,看看错误是否存在。

我对你的使用案例的假设:你有一个包含文件和目录的现有目录,现在想把它转换成从其他地方克隆的git存储库, 而不改变当前目录中的任何数据。

实际上有两种方法。

克隆回购 – mv .git – git reset –hard

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

 git reset --hard 

但是,这将改变当前目录中的文件状态。 你可以在你的目录的完整拷贝/ rsync上试试这个,并研究一下哪些变化。 至less之后,你不应该再看到git logstatus之间的差异。

初始化新的回购 – 指向原点

第二个不那么令人不安:cd到你的目的地,并开始一个新的回购

 git init 

那么你告诉那个新的回购,它有一个祖先在其他地方:

 git remote add origin original_git_repo_path 

然后安全

 git fetch origin master 

复制数据而不更改您的本地文件。 现在一切都应该好了。

我总是推荐第二种方法来减less错误。

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

 $ git diff 

git只是简单地返回到没有错误的提示。

如果我input

 $ git diff <filename> 

git只是简单地返回到没有错误的提示。

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

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

所以,如果你input:git diff,它只是返回到提示你可能有这个问题。

由git运行的diff.exe位于你的mingw64 \ bin目录下

最后,为了解决这个问题,我真的把我的mingw64 \ bin目录复制到了git所在的位置。我试过了,但仍然无法工作。

然后,我closures了我的git bash窗口,并再次打开它去了我的同一个回购失败,现在它的工作。

希望这也能帮助你。

简答

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

Git状态显示更改的文件和Git的比较是什么都没有显示…

 > 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 > 

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

例如,我有一个mainpage.xaml文件。 在文件资源pipe理器中,我将一个新的mainpage.xaml文件粘贴到当前的回购站中。 我在另一台机器上完成了这个工作,并在这里粘贴了这个文件。
混帐显示修改

该文件显示修改,但是当我运行git diff时,它不会显示更改。 这可能是因为该文件的文件信息已经改变,并且git知道它不是真正的文件。 有趣。

git diff什么都没显示

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