我的 git 工作目录中有五个文件 git status
显示已修改。当我 git diff
它们时,整个文件显示为已更改。我有 core.autocrlf true
但它似乎没有效果。
当我试图从同事那里 pull 更改时,真正的问题浮出水面。其中一个“修改过的”文件会被 merge 覆盖,所以我把它们藏起来了。令我惊讶的是,变化仍然存在。
[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
,但它也没有帮助。
这里可能有什么问题?有什么方法可以解决这个问题,还是我应该删除并再次克隆整个存储库?
最佳答案
关于发生的事情,我最好的猜测是你在 Windows 机器上,并且在你的 .gitattributes
文件中的某处你有一个指令告诉 git 执行行结束规范化(通过 * text=auto
或类似的东西)。如果确实如此,那么当您 checkout 文件时,它的 LF 将转换为 CRLF,而当您提交文件时,其 CRLF 将转换为 LF。
如果情况确实如此,那么最有可能发生的情况是相关文件的存储库版本以某种方式在其中包含 CRLF。当您 checkout 它们时,工作副本当然也会有这些 CRLF。现在问题来了:当执行 git status
、git diff
等操作时,git 会将 repo/index 中的内容与工作目录中的实际内容进行比较,但是在行结束规范化完成后,将提交什么,即用 LF 替换 CRLF。在这种情况下,git 看到索引/存储库中的内容具有 CRLF,而您将提交的内容只有 LF,因此存在差异。
要查看是否是这种情况,请运行以下命令:
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 放入存储库副本的效果,从而解决 future 的问题。但是,如果使用存储库的每个人都在 Windows 上,那么实际上根本不需要行规范化。您可以通过将 * -text
放入您的 .gitattributes
文件中来禁用它们(并删除其下方将文件类型设置为文本的任何行)。这是我遇到这个问题时选择的选项,因为我不喜欢我的版本控制系统更改我的文件内容。
关于git - git 工作目录中的更改拒绝还原,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19686419/