有人可以向我解释git diff在这里看到的区别吗?

时间:2014-04-24 11:00:37

标签: git msysgit

我通过msysgit在Windows 7上使用git。最近让我感到非常悲痛的一个问题是,当我切换到某些分支时,git认为某些文件已被更改,然后我无能为力使其停止认为这些文件已经发生变化。

在我的案例中复制的步骤(可能与每个人无关)如下:

  1. 检查主分支。
  2. 查看pristine-3.7分支。
  3. 查看pristine-3.8分支。
  4. 查看pristine-3.9分支。
  5. 此时,git开始假设文件已经更改。

    例如,这是git diff输出的屏幕截图。

    git diff output

    这是在十六进制模式下使用Beyond Compare的同一文件的diff输出。

    enter image description here

    最后,git状态输出!

    enter image description here

    发生了什么事?

    更新问题:

    一种可能的解决方案是在本地提交更改,然后删除该提交,而不将提交中的更改重新置于工作状态。怎么做的?

2 个答案:

答案 0 :(得分: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用户仍然遭受微软历史决定使用双字节代码进行单行换行,而不是历史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文件