我只想回到一个干净的工作目录,就像我上次提交后一样。 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 checkout [file]
即可获取特定文件。但 git reset --hard
应该对整棵树做到这一点。如果您认为这只是行尾,请先输入 git diff
,然后再输入 git diff --ignore-all-space
。如果第一个差异显示更改,而第二个差异没有,那么至少您知道存在行结束问题,在这种情况下您可能需要查看 git 和行结束的描述。
尝试这篇 github 文章 之后的“重新规范化存储库”部分中介绍的方法,确保您的 EOL 设置具有合理的值(对于您的操作系统和存储库策略)
贡献我的案例: 有一个文件的状态为
modified
,我无法使用 git reset --hard
重置该文件。上述命令都没有帮助我,文件始终处于修改状态。... 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
。
所以,我只是删除了一个不相关的文件,只留下了一个。
如果 Git 认为您的文件由于尝试自动标准化行结尾而被修改(如果
git diff
显示差异,但 git diff --ignore-all-space
没有),则最好的解决方案可能是关闭行结尾修改你的项目。如果您的团队都对给定的文件集使用相同的平台(Windows、Linux 等),那么这种方法非常有效。
要关闭项目的行尾修改,请在存储库的根目录中打开或创建
.gitattributes
。确保文件包含此行:
* -text
如果文件存在并且对
*
有不同的设置,例如 * text=auto
,请将其替换为上面的行。
就我而言,无论顺序如何,
git checkout -- .
、git reset --hard
和git clean -fd .
都没有帮助——仍然剩下一个目录被“修改”。因此,我已更改为特定目录并从此处运行 git checkout -- .
。不知道为什么我必须首先更改目录的根本原因,但它令人惊讶地帮助摆脱了这些修改。
使用子模块时可能会发生这种情况,您可以尝试
git submodule update
我尝试了上面提到的所有内容,例如
git rm --cached -r .
之前的git reset --hard
。
最后对我有用的是在本地删除我的存储库并再次克隆它,检查我的分支,用
git reset --hard commit_id
跳回一些提交,然后重做我的工作,然后 git push --force
但这是极其危险的,必须与注意,如果您在 git push --force
之前不备份您的工作,您可能会损失几天的工作。这是我最不想尝试的事情,有句话叫“乞丐不能挑三拣四”,而我就是一个乞丐。