为什么我在git中切换分支时无法摆脱差异,以及如何解决它?

时间:2013-12-06 14:52:10

标签: git

以下是命令行的一些相关输出(poshgit显示状态):

[Branch1]> git checkout Branch2
Switched to branch 'Branch2'
[Branch2 +0 ~3 -0]> 
[Branch2 +0 ~3 -0]> git diff --ignore-space-at-eol
[Branch2 +0 ~3 -0]> git checkout .
[Branch2 +0 ~3 -0]>

我尝试了this question

中建议的解决方案
[Branch2 +0 ~3 -0]> git reset --hard
HEAD is now at c8be749 some comment
[Branch2 +0 ~3 -0]> git reset HEAD
Unstaged another commit:
M       Src/somefile
M       Src/someotherfile.cs
M       Src/athirdfile.cs
[Branch2 +0 ~3 -0]>

这是如何发生的,除了提交更改之外,我如何解决它,因为我似乎无法撤消差异。即使藏匿什么都不做。

我们非常感谢有关我们如何陷入困境以及如何摆脱困境的一些建议。

我现在已经能够可靠地重现这一点,所以我能够获得更明确的答案。如果我刚刚克隆了我的回购,然后切换到分支然后回到主人我得到一些文件,说他们有变化。我尝试过使用core.autocrlf的设置,但这似乎只是改变了受影响的文件数量,并没有完全解决问题。

我可以做些什么来尝试解决这个日益恼人的问题?

3 个答案:

答案 0 :(得分:5)

您没有提到您使用的操作系统,您的远程仓库使用的操作系统(如果有)或您的团队是否与其他操作系统跨平台工作。这种信息可能有助于诊断问题。

由于以下原因,我发现这些问题突然出现:

  • 行结尾(Windows vs Mac vs Linux)

    使用core。* crlf设置和.gitattributes文件修复此问题。这个和gitattributes联机帮助页面的github帮助页面是很好的资源。

    Trying to fix line-endings with git filter-branch, but having no luck https://help.github.com/articles/dealing-with-line-endings https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html

    请不要错过github帮助末尾的部分,该部分介绍了在完成此设置后如何规范化您的回购:

      

    在设置core.autocrlf选项并提交.gitattributes文件之后,您可能会发现git想要提交您未修改的文件。这是因为git想要为你的行结尾标准化。最好的方法是......

  • 当不匹配案例的文件/目录已存在时,不区分大小写的文件系统

    特别是,Src dir对我来说特别可疑。这通常是因为有人将回购中的文件重命名为同一名称,但对一个或多个字母使用了不同的大小写。然后有人更新他们的本地仓库和工作目录,git被(不区分大小写的文件系统)文件系统告知文件/目录已经存在,但是其他git代码会将文件/目录视为新的。

    尝试在新的或空目录中进行新的克隆。查看新鲜克隆中的有问题文件与原始克隆的路径之间的文件名/目录字母大小写是否不同(仔细查看Src目录 - 它可能是回购中的src。我可以在Unix / Linux系统上进行新的克隆。

  • 文件名中的Unicode字符

    这似乎不是你的问题,但我认为值得一提的是完整性。这是不区分大小写问题的变体,但也受文件系统如何处理文件名中的Unicode字符的影响。

    有关其他人在文件名中使用Unicode的问题的说明,请参阅Git clean not removing a file

答案 1 :(得分:1)

此问题可能是由于不同操作系统中的行结束首选项。

如果您是Unix/Mac用户,请将配置设置如下

git config --global core.autocrlf input
git config --global core.safecrlf true

如果您在Windows,请尝试按以下配置

git config --global core.autocrlf true
git config --global core.safecrlf true

完成这些设置后,切换分支后,git status不应抱怨任何内容。

答案 2 :(得分:1)

git clean -id应该做你想要的。

i将让您验证在d告诉它删除额外目录时删除的内容。小心不要太干净,拿出任何想要保留的东西。