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

标签 git

我的 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 statusgit 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/

相关文章:

git - 如何使推送/拆分的子树保持最新状态?

git - 管理 Git 分支和子分支?

git - 正在进行中。无法提交。如何进行或停止(abort)?

git - 我需要在裸仓库上运行 git gc 吗?

git - 有没有一种简单的方法来显示与目录树中的任何文件都不匹配的 .gitignore 规则?

java - 子模块是解决此 GUI 问题的正确方法吗?

git - 任何查看 git 版本之间差异的工具

git - Jenkins:git "Checking out Revision"后失败

git - git pull 密码错误 - 重新提示密码?

Github post-receive hook自动 pull 回滚