Git无法撤销修改过的文件。

11

我只想回到一个干净的工作目录,就像在最后一次提交之后一样。 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")

正如您所看到的,尽管回滚了,但没有任何更改。

然后我按照建议运行了一个忽略所有空格的diff,像我预料的那样,在忽略空格时似乎没有差异 - 所以我猜想是行结尾符!我该怎么办才能解决这个问题?我已经将autocrlf设置为true,但没有效果。


你尝试过询问 git diff 来查找修改内容吗? - Lily Ballard
是的,我已经做过了,基本上是说每一行都改变了,所以我认为可能与行结尾有关。不过奇怪的是,我所有的工作都是在同一台计算机上的一个操作系统上完成的,所以不确定这可能是如何发生的。 - WickyNilliams
这是在重置后甚至在打开文件之前发生的吗?我曾经发现我的IDE在我没有要求的情况下,由于几个月前设置的一些疯狂偏好,为我更改了行尾。 - Bob Gilmore
你可以发布 git status 输出的相关部分吗? - F.X.
6个回答

9
如果你只想将文件恢复到上一次提交后的状态,只需使用git checkout [file]获取特定文件即可。但是git reset --hard应该可以将整个树恢复为原始状态。如果你认为只是行尾符的问题,请执行git diff然后执行git diff --ignore-all-space。如果第一个diff显示有更改而第二个没有,则至少你知道存在行尾符问题,这时你可能需要查看git和行尾符的处理方式的说明。

谢谢,忽略空格后文件没有差异,因此必须是行尾符号的问题。我会遵循 Github 上的文章。本来希望能避免为修复行尾符号而提交一个特定的 commit,但看来我必须这样做了。 - WickyNilliams

4

在确保您的EOL设置合理(适用于您的操作系统和存储库策略)后,尝试按照此Github文章中“重新规范化存储库”部分所解释的方法。


11
确实,对我来说,在执行git reset --hard之前运行git rm --cached -r .起了作用。 - Karussell
在这两个语句之间,我不得不执行 git add -A 命令,但这在我的端上也起作用了。 - Jannik

3

分享我的经历:

有一个文件处于 modified 状态,我无法使用 git reset --hard 将其重置。尝试了上述所有命令都没有帮助,该文件始终保持在修改状态。

更有趣的是,即使是新克隆的版本仍然存在这个问题!但是git给了我一个提示:

... bla bla bla git clone ....
Resolving deltas: 100% (37818/37818), done.
warning: the following paths have collided (e.g. case-sensitive paths
on a case-insensitive filesystem) and only one from the same
colliding group is in the working tree:

  'a/b/c/Myfile.kt'
  'a/b/c/MyFile.kt'

事实证明,某个人在大小写敏感的文件系统(Linux)上不小心提交了两个文件,它们的名称相同但大小写不同,且内容也不同。当我在大小写不敏感的文件系统(macOS、Windows)上打开这个存储库时,Git 认为这是同一个文件,并总是将其显示为“修改”从 MyFile.ktMyfile.kt 或从 Myfile.ktMyFile.kt

所以,我只删除了一个无关的文件,只保留了一个文件。


0
如果Git认为您的文件已被修改,是由于其尝试自动规范化行尾(如果git diff显示差异,但git diff --ignore-all-space则不会),那么您最好的解决方案可能是关闭项目的行尾修改。如果您的团队都使用相同的平台(Windows、Linux等)来处理一组文件,则此方法效果很好。
要关闭项目的行尾修改,请在存储库的根目录中打开或创建.gitattributes文件。确保该文件包含以下行:
* -text

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

0
这可能发生在使用子模块时,您可以尝试执行 git submodule update

0
在我的情况下,无论以什么顺序运行git checkout -- .git reset --hardgit clean -fd .都没有帮助,仍有一个目录被标记为“已修改”。所以我切换到特定的目录并从那里运行git checkout -- .。不知道为什么我必须先改变目录,但这出乎意料地帮助我摆脱了那些修改。

谢谢 - 这很有帮助。为什么这种事总是发生在我身上? - user12411795

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