Git工作目录中的更改拒绝还原

3

我的git工作目录中有五个文件被git status显示为已修改状态。当我用git diff比较它们时,整个文件都被标记为已更改。我设置了core.autocrlf true,但似乎没有任何效果。

真正的问题出现在我尝试从同事那里拉取变更时。其中一个"已修改"的文件会被合并覆盖,所以我将它们藏起来了。令我惊讶的是,这些更改还在那里。

[dev@carbon:/var/www/html/ourcustomer]$ git stash
Saved working directory and index state WIP on master: ccb93db Merge remote branch 'origin/master'
HEAD is now at ccb93db Merge remote branch 'origin/master'
[dev@carbon:/var/www/html/ourcustomer]$ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   src/ourcustomer/SiteBundle/Resources/public/css/main.css
#       modified:   src/ourcustomer/SiteBundle/Resources/public/js/main.js
#       modified:   src/ourcustomer/SiteBundle/Resources/public/js/ourcompany-resize.js
#       modified:   src/ourcustomer/SiteBundle/Resources/views/Login/languageSelector.html.twig
#       modified:   src/ourcustomer/SiteBundle/Resources/views/layout.html.twig
#
no changes added to commit (use "git add" and/or "git commit -a")

在这之后,我尝试了git reset --hard HEAD - 但结果相同。我还尝试了git checkout -- src/ourcustomer/SiteBundle/Resources/public/css/main.css,但也没有帮助。

这里可能出了什么问题?有没有什么方法可以解决这个问题,还是应该删除并重新克隆整个存储库?


1
这可能很有趣:https://dev59.com/G2gu5IYBdhLWcg3w4665 - Lajos Veres
尝试删除文件,然后运行 git reset --hard HEAD。它们是否仍然显示为已修改? - Pedro Rodrigues
@PedroRodrigues:是的,它们会。在重置之前,它们会显示为已删除,在重置后它们会变成修改过的状态。 - Kaivosukeltaja
@Kaivosukeltaja:有几个问题:1)差异只在EOF字符上吗?git diff -w不输出任何内容吗?2)您是否在.gitconfig.gitattributes中进行了任何配置,影响了EOF?3)删除索引rm .git/index和有问题的文件,然后git reset --hard HEAD仍然没有帮助吗? - Pedro Rodrigues
还可以尝试使用 git diff -b 命令,查看是否只有空格变更。 - Mark Leighton Fisher
1个回答

1
我最好的猜测是你在使用Windows机器,在你的.gitattributes文件中有一条指令告诉git执行行结束标准化(通过* text=auto或类似的方式)。如果确实是这种情况,那么当你检出一个文件时,它的LF会被转换为CRLF,当你提交一个文件时,它的CRLF会被转换为LF。
如果确实是这种情况,那么最有可能发生的是,问题文件的存储库版本中某些具有CRLFs。当你检出它们时,工作副本当然也会有这些CRLFs。现在问题来了:在进行git status、git diff等操作时,git将存储库/索引中的内容与实际在你的工作目录中的内容进行比较,而是与完成行结束标准化后将要提交的内容进行比较,即用LF替换CRLFs。在这种情况下,git看到存储库/索引中有CRLFs,而你将要提交的只有LFs,因此存在差异。
要查看是否是这种情况,请运行以下命令:
git hash-object src/ourcustomer/SiteBundle/Resources/public/css/main.css 
git hash-object --no-filter src/ourcustomer/SiteBundle/Resources/public/css/main.css 
git ls-files -s src/ourcustomer/SiteBundle/Resources/public/css/main.css 

第一个命令将显示将要提交的哈希值。第二个命令显示实际在您的工作目录中的哈希值。第三个命令显示索引中的哈希值。如果第一个和第二个哈希值不同,并且第二个和第三个哈希值相同,则几乎可以确定您处于我描述的情况。

那么问题是,如何解决这个问题?一种简单的方法是简单地添加/提交“更改”。这将使存储库副本中的LF解决向前的问题。然而,如果使用存储库的每个人都在Windows上,那么真的没有必要进行行规范化。您可以通过在.gitattributes文件中放置* -text来禁用它们(并删除下面设置文件类型为文本的任何行)。当我遇到这个问题时,这就是我选择的选项,因为我不喜欢我的版本控制系统更改我的文件内容。


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