有人能向我解释一下,git diff 在这里看到了什么不同之处吗?

4
我正在使用msysgit在Windows 7上使用git。最近遇到的一个问题是,只要我切换到某些分支,git就会认为一些文件已经被更改,然后我无法停止它认为这些文件已经更改了。
我的问题重现步骤(可能不适用于所有人)如下:
1.检出主分支。 2.检出pristine-3.7分支。 3.检出pristine-3.8分支。 4.检出pristine-3.9分支。
此时,git开始假设有文件已更改。
例如,这里是git diff输出的截图。
以下是相同文件的Beyond Compare十六进制模式下的差异输出。
最后,我们来看一下git status输出!
发生了什么?
问题更新:
一种可能的解决方案是本地提交更改,然后删除该提交,而无需将更改放回工作状态。如何操作?

如果没有明显的功能差异,那么只需使用 git checkout -- filename.x 从存储库中检索“原始”文件。 - Mihai Stancu
我已经尝试过其他建议的修复方法,例如core.autocrlf设置、core.filemode设置等,还有硬重置和还原。唯一能解决问题的是提交这些文件。但我不想这样做(因为我想要这些分支被冻结)。还原/重置没有帮助。我也尝试了rm .git/index后跟着一个git reset --hard - Umar Farooq Khawaja
红色块显示的是尾随空格,这可能与CRLF有关。我对此并不是专家,但也许这可以帮到你。 - Tim
那也是我的最初想法。这就是为什么我进行了十六进制比较(中间的截图)。十六进制比较显示这两个文件之间没有一个字节不同。 - Umar Farooq Khawaja
使用 git checkout 文件名 命令可以在“更改”之前获取旧文件。您是否检查了文件权限?执行 git ls-tree HEADgit ls-tree abc1234 并进行比较(abc1234 应替换为上一个提交的十六进制值)。 - Michael Tomkins
我会尝试一下,但与此同时,我已经放弃了git,转而使用hg。这最终让我浪费了几天时间,所以我决定不再继续使用git了。不过,还是非常感谢你的帮助。 - Umar Farooq Khawaja
2个回答

2
听起来像是autocrlf问题。此外,您可能已启用了smudgeclean过滤器,并使用自定义实现导致问题。
我建议执行:
git diff --raw master pristine-3.9 -- packages/fop-10/lib
git diff --raw pristine-3.7 pristine-3.9 -- packages/fop-10/lib

并且检查结果。请放心,git确实保存了二进制内容,并且保存的二进制内容与分支末尾的SHA-1匹配。然而,如果您使用一些功能(例如autocrlfsmudge),则二进制内容可能与工作目录中的二进制内容不匹配。 autocrlf更容易导致Windows用户出现问题,因为Windows用户仍然受到Microsoft历史决定的影响,该决定使用两个字节的代码来表示单个换行符,而不是历史UNIX兼容系统和Machintosh OS中使用的单个字节代码。


2
我经常遇到这个问题 - 唯一有效的方法是:
git rm --cached -r . > /dev/null # redirect if output is huge
git reset --hard

请确保您没有想要保存的更改。
请参阅“git行结尾-无法隐藏,重置,现在无法在虚假的行结尾提交上进行变基”的此处
有人必须创建一个展示此行为并将其发布到git跟踪器的示例存储库——这是一个错误(在这样的情况下,git reset --hard等应立即起作用)。
编辑:确保您已阅读必备阅读材料并设置了一个.gitattributes文件。

感谢您提供答案,尽管在经历了数月的痛苦和一些遗失的工作后,我转向了Mercurial,我认为这更好,但这可能对比我不幸的人有用 :) - Umar Farooq Khawaja
@UmarFarooqKhawaja:我不同意你的观点——Git太棒了——但是,是的,你会遇到一些问题——这可能是我没有完全理解的问题。但是,我们应该尝试生成可重现的示例并发布错误,而不是逃跑。Git具有Mercurial根本没有的功能——所以某个美好的早晨,你会想念它 :) - Mr_and_Mrs_D
据我所知,缺少功能的是Git而不是Mercurial。您有什么功能想法? - Umar Farooq Khawaja
@UmarFarooqKhawaja:Mercurial能追踪函数从一个文件移动到另一个文件吗?您可以交互地变基您的分支吗?天呐 - 我听说它甚至没有索引:D - Mr_and_Mrs_D

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