我通过msysgit在Windows 7上使用git。最近让我感到非常悲痛的一个问题是,当我切换到某些分支时,git认为某些文件已被更改,然后我无能为力使其停止认为这些文件已经发生变化。
在我的案例中复制的步骤(可能与每个人无关)如下:
此时,git开始假设文件已经更改。
例如,这是git diff输出的屏幕截图。
这是在十六进制模式下使用Beyond Compare的同一文件的diff输出。
最后,git状态输出!
发生了什么事?
更新问题:
一种可能的解决方案是在本地提交更改,然后删除该提交,而不将提交中的更改重新置于工作状态。怎么做的?
答案 0 :(得分:2)
听起来像autocrlf
问题。此外,您可能会使用导致问题的自定义实现启用smudge
和clean
过滤器。
我建议做
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相匹配。但是,如果您使用某些功能(例如autocrlf
或smudge
),二进制内容可能不匹配工作目录二进制内容。 autocrlf
更容易导致Windows用户出现问题,因为Windows用户仍然遭受微软历史决定使用双字节代码进行单行换行,而不是历史UNIX兼容系统和Machintosh OS中使用的单字节代码
答案 1 :(得分:2)
我经常遇到这个问题 - 唯一有效的是:
git rm --cached -r . > /dev/null # redirect if output is huge
git reset --hard
但请确保您没有要保留的更改
请参阅git line endings - can't stash, reset and now can't rebase over spurious line endings commit
有人必须制作展示此行为的示例回购并将其发布到git跟踪器 - 这是一个错误(在git reset --hard
和co应该立即起作用的意义上)
编辑:确保您已阅读required reading并设置.gitattributes
文件