Git无法撤消已修改的文件

时间:2012-10-09 23:39:11

标签: git rollback git-stash git-reset

我只想回到一个干净的工作目录,就像我上次提交后一样。 Git向我报告了一些我没有做过的文件修改,所以我怀疑它与行结尾有关。

我已经尝试过所有常见的嫌疑人:

git reset --hard git commit -- . git stash git clean -fd

无论我做什么,git status始终显示与修改过的文件相同的文件。我能做什么?我在另一个分支中隐藏了一些未提交的更改,所以我不想抛弃所有内容,而只是“回滚”我的主分支。

编辑:输出

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   demo/index.html
#   modified:   demo/js/app.js
#   modified:   demo/js/libs/jquery.1.7.1.js
#   modified:   demo/js/libs/matchMedia.js
#   modified:   demo/js/libs/modernizr.js
#   modified:   demo/js/loadr.js
#   modified:   dist/enquire.js
#   modified:   src/include/intro.js
#
no changes added to commit (use "git add" and/or "git commit -a")

然后我尝试建议的内容以及我能找到的所有其他内容:

WickyNilliams at Nick MBA in ~/Repositories/enquire on master*
$ git checkout -- .
WickyNilliams at Nick MBA in ~/Repositories/enquire on master*
$ git reset --hard
HEAD is now at d70fee4 added meta tag to test demo on mobile #10
WickyNilliams at Nick MBA in ~/Repositories/enquire on master*
$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   demo/index.html
#   modified:   demo/js/app.js
#   modified:   demo/js/libs/jquery.1.7.1.js
#   modified:   demo/js/libs/matchMedia.js
#   modified:   demo/js/libs/modernizr.js
#   modified:   demo/js/loadr.js
#   modified:   dist/enquire.js
#   modified:   src/include/intro.js
#
no changes added to commit (use "git add" and/or "git commit -a")

正如您所看到的,尽管有回滚,但没有任何变化。

然后我遵循建议并且运行了一个忽略所有空间的差异,并且怀疑看起来在忽略空格时似乎没有差异 - 所以我猜这是行结尾!我该怎么做才能解决这个问题?我设置为autocrlftrue无效。

4 个答案:

答案 0 :(得分:4)

如果您只想将文件更改回上次提交后的方式,只需执行git checkout [file]即可获取特定文件。但是git reset --hard应该对整棵树做到这一点。如果您认为这只是行结尾,请执行git diff,然后执行git diff --ignore-all-space。如果第一个差异显示更改而第二个差异没有显示,那么至少您知道有一个行结束问题,在这种情况下,您可能希望查看git and line endings的此描述。

答案 1 :(得分:2)

在之后尝试this github article 的“重新规范化回购”部分中说明的方法,确保您的EOL设置具有合理的值(适用于您的操作系统和回购策略)

答案 2 :(得分:0)

如果Git认为您的文件由于尝试自动规范化行结尾而被修改(如果git diff显示差异,但git diff --ignore-all-space没有显示差异,则会为真),您的最佳解决方案可能是关闭项目的行结束修改。如果您的团队对给定的文件集使用相同的平台(Windows,Linux等),这种方法很有效。

要关闭项目的行结束修改,请在存储库的根目录中打开或创建.gitattributes。确保该文件包含以下行:

* -text

如果文件存在并且*的设置不同,例如* text=auto,请将其替换为上述行。

答案 3 :(得分:0)

就我而言,git checkout -- .git reset --hardgit clean -fd .都无济于事,无论顺序如何-仍然有一个目录被“修改”。因此,我已切换到特定目录并从此处运行git checkout -- .。我不知道为什么我必须首先更改目录的根本原因,但是它出人意料地帮助摆脱了这些修改。