Git 无法撤消修改的文件

问题描述 投票:0回答:7

我只想回到一个干净的工作目录,就像我上次提交后一样。 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 rollback git-stash git-reset
7个回答
9
投票

如果您只想将文件更改回上次提交后的状态,只需执行

git checkout [file]
即可获取特定文件。但
git reset --hard
应该对整棵树做到这一点。如果您认为这只是行尾,请先输入
git diff
,然后再输入
git diff --ignore-all-space
。如果第一个差异显示更改,而第二个差异没有,那么至少您知道存在行结束问题,在这种情况下您可能需要查看 git 和行结束的描述。


4
投票

尝试这篇 github 文章 之后的“重新规范化存储库”部分中介绍的方法,确保您的 EOL 设置具有合理的值(对于您的操作系统和存储库策略)


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.kt
Myfile.kt
或从
Myfile.kt
MyFile.kt

所以,我只是删除了一个不相关的文件,只留下了一个。


0
投票

如果 Git 认为您的文件由于尝试自动标准化行结尾而被修改(如果

git diff
显示差异,但
git diff --ignore-all-space
没有),则最好的解决方案可能是关闭行结尾修改你的项目。如果您的团队都对给定的文件集使用相同的平台(Windows、Linux 等),那么这种方法非常有效。

要关闭项目的行尾修改,请在存储库的根目录中打开或创建

.gitattributes
。确保文件包含此行:

* -text

如果文件存在并且对

*
有不同的设置,例如
* text=auto
,请将其替换为上面的行。


0
投票

就我而言,无论顺序如何,

git checkout -- .
git reset --hard
git clean -fd .
都没有帮助——仍然剩下一个目录被“修改”。因此,我已更改为特定目录并从此处运行
git checkout -- .
。不知道为什么我必须首先更改目录的根本原因,但它令人惊讶地帮助摆脱了这些修改。


0
投票

使用子模块时可能会发生这种情况,您可以尝试

git submodule update


0
投票

我尝试了上面提到的所有内容,例如

git rm --cached -r .
之前的
git reset --hard

最后对我有用的是在本地删除我的存储库并再次克隆它,检查我的分支,用

git reset --hard commit_id
跳回一些提交,然后重做我的工作,然后
git push --force
但这是极其危险的,必须与注意,如果您在
git push --force
之前不备份您的工作,您可能会损失几天的工作。这是我最不想尝试的事情,有句话叫“乞丐不能挑三拣四”,而我就是一个乞丐。

© www.soinside.com 2019 - 2024. All rights reserved.