249

我想删除对我的工作副本的所有更改。
运行git status显示文件已修改。
我所做的一切似乎都无法消除这些修改。
例如:

rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ 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:   Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
#       modified:   Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
#       modified:   Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
#       modified:   Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")

rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git checkout -- Rhino.Etl.Core/Enumerables/CachingEnumerable.cs

rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ 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:   Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
#       modified:   Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
#       modified:   Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
#       modified:   Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")

rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git checkout `git ls-files -m`

rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ 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:   Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
#       modified:   Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
#       modified:   Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
#       modified:   Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")

rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git reset --hard HEAD
HEAD is now at 6c857e7 boo libraries updated to 2.0.9.2 and rhino.dsl.dll updated.

rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ 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:   Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
#       modified:   Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
#       modified:   Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
#       modified:   Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")
4

24 回答 24

246

我在 Windows 上遇到了这个问题,但不准备研究使用的config --global core.autocrlf false后果 我只需要完成一些事情。现在。

这对我有用,因为你让 git 完全重写你的工作目录:

git rm --cached -r .
git reset --hard

(请注意,运行git reset --hard还不够好,在原始问题的评论中建议rm之前的文件也不是简单的)reset

于 2013-09-13T18:14:48.500 回答
139

有多个问题可能导致此行为:

行尾归一化

我也遇到过这类问题。归结为 git 自动将 crlf 转换为 lf。这通常是由单个文件中的混合行结尾引起的。该文件在索引中被规范化,但是当 git 然后再次对其进行非规范化以将其与工作树中的文件进行比较时,结果是不同的。

但是如果你想解决这个问题,你应该禁用core.autocrlf,将所有行尾更改为 lf,然后再次启用它。或者您可以通过执行以下操作完全禁用它:

git config --global core.autocrlf false

除了core.autocrlf,您还可以考虑使用.gitattributes文件。这样,您可以确保使用 repo 的每个人都使用相同的规范化规则,防止混合行结尾进入存储库。

如果您希望 git 在执行不可逆规范化时向您发出警告,还可以考虑将core.safecrlf设置为警告。

git手册页这样说:

CRLF 转换可能会损坏数据。autocrlf=true 将在提交期间将 CRLF 转换为 LF,在结帐期间将 LF 转换为 CRLF。git 无法重新创建在提交之前包含 LF 和 CRLF 混合的文件。对于文本文件,这是正确的做法:它更正了行尾,以便我们在存储库中只有 LF 行尾。但是对于意外归类为文本的二进制文件,转换可能会损坏数据。

不区分大小写的文件系统

在不区分大小写的文件系统上,当存储库中存在相同的文件名但大小写不同的文件时,git 会尝试检查两者,但只有一个最终会出现在文件系统上。当 git 尝试比较第二个时,它会将其与错误的文件进行比较。

解决方案是切换到不区分大小写的文件系统,但在大多数情况下这是不可行的,或者重命名并提交另一个文件系统上的文件之一。

于 2010-01-06T21:34:25.593 回答
114

另一个可能对人们有用的解决方案,因为没有一个文本选项对我有用:

  1. 将 的内容替换为.gitattributes一行:* binary. 这告诉 git 将每个文件视为一个它不能做任何事情的二进制文件。
  2. 检查违规文件的消息是否消失;如果不是,您可以git checkout -- <files>将它们恢复到存储库版本
  3. git checkout -- .gitattributes.gitattributes文件恢复到其初始状态
  4. 检查文件是否仍未标记为已更改。
于 2014-10-13T19:12:47.490 回答
78

对于将来遇到此问题的人:更改文件模式也可能具有相同的症状。 git config core.filemode false会修复它。

于 2012-12-06T18:00:37.433 回答
33

这一直让我发疯,尤其是如果没有在线找到任何解决方案,我无法解决这个问题。这是我解决它的方法。由于这是同事的工作,因此无法在此处获得学分:)

问题的根源:我最初安装的 git 在 windows 上没有自动行转换。这导致我最初对 GLFW 的提交没有正确的行尾。

注意:这只是一个本地解决方案。下一个克隆 repo 的人仍然会遇到这个问题。可以在此处找到永久解决方案: https ://help.github.com/articles/dealing-with-line-endings/#re-normalizing-a-repository 。

设置:Xubuntu 12.04 Git repo 和 glfw 项目

问题:无法重置 glfw 文件。无论我尝试了什么,它们总是显示为已修改。

解决了:

edit .gitattributes

Comment out the line:    # text=auto

Save the file

restore .gitattributes:   git checkout .gitattributes
于 2013-08-29T13:52:45.833 回答
12

我有一个有同样问题的 .bat 文件(无法在未跟踪的文件中删除它)。git checkout - 没有用,这个页面上的任何建议也没有。唯一对我有用的是:

git stash save --keep-index

然后删除存储:

git stash drop
于 2014-02-07T00:56:32.990 回答
9

两次遇到同样的问题!两次存储我所做的一些更改然后尝试将它们弹出回来。由于我有很多已更改的文件,因此无法弹出更改-但它们不是!它们完全相同。

我现在想我已经尝试了上述所有解决方案,但都没有成功。尝试后

git rm --cached -r .
git reset --hard

我现在修改了存储库中的几乎所有文件。

比较文件时,它说我已经删除了所有行,然后再次添加它们。

有点令人不安。我现在将避免将来藏匿..

唯一的解决方案是克隆一个新的存储库并重新开始。(上次做的)

于 2015-06-05T08:58:58.810 回答
6

尝试做一个

git 结帐 -f

这应该清除当前工作本地仓库中的所有更改

于 2018-02-05T04:10:18.450 回答
5

通常,在 GIT 中清除所有修改和新文件,以下 2 个命令应该可以很好地工作(小心,这将删除您可能创建的所有新文件+文件夹并将所有修改后的文件恢复到当前状态提交):

$ git clean --force -d
$ git checkout -- .

有时更好的选择可能是使用可选消息执行“git stash push”,如下所示:

$ git stash push -m "not sure if i will need this later"

这也将清除所有新的和修改过的文件,但如果你想恢复它们,你会将它们全部隐藏起来。GIT 中的 Stash 从一个分支传送到另一个分支,因此如果您愿意,可以在不同的分支中恢复它们。

附带说明一下,如果您已经暂存了一些新添加的文件并想删除它们,这应该可以解决问题:

$ git reset --hard

如果以上所有内容都不适合您,请阅读下面对我有用的内容:

我之前遇到过几次这个问题。我目前正在我的雇主提供的 Windows 10 机器上进行开发。今天,这种特殊的 git 行为是由我从我的“开发”分支创建一个新分支引起的。出于某种原因,在我切换回“开发”分支后,一些看似随机的文件仍然存在,并在“git status”中显示为“已修改”。

此外,那时我无法签出另一个分支,所以我被困在我的“开发”分支上。

这就是我所做的:

$ git log

我注意到我今天早些时候从“开发”创建的新分支显示在第一个“提交”消息中,在末尾被引用“HEAD -> develop, origin/develop, origin/HEAD, The-branch-i-created -今天早些时候“。

因为我真的不需要它,所以我删除了它:

$ git branch -d The-branch-i-created-earlier-today

更改的文件仍然显示,所以我做了:

$ git stash

这解决了我的问题:

$ git status
On branch develop
Your branch is up to date with 'origin/develop'.

nothing to commit, working tree clean

当然$ git stash list会显示隐藏的更改,并且由于我的存储很少而且不需要任何存储,我确实$ git stash clear删除了所有存储。

注意:我还没有尝试过有人在我之前提出的建议:

$ git rm --cached -r .
$ git reset --hard

这可能也有效,下次遇到此问题时,我一定会尝试。

于 2018-08-01T00:16:07.747 回答
4

我只能通过临时删除我的 repo 的 .gitattributes 文件(定义* text=auto*.c text)来解决这个问题。

git status删除后运行,修改消失了。即使在 .gitattributes 被放回原位后,它们也没有返回。

于 2013-09-13T10:08:19.797 回答
2

有一致的行尾是一件好事。例如,它不会触发不必要的合并,尽管是微不足道的。我已经看到 Visual Studio 创建具有混合行尾的文件。

此外,某些程序(如 bash(在 linux 上))确实要求 .sh 文件以 LF 终止。

为了确保发生这种情况,您可以使用 gitattributes。无论 autcrlf 的值是什么,它都适用于存储库级别。

例如,你可以有这样的 .gitattributes:* text=auto

如果在您的情况下确实很重要,您还可以对每个文件类型/扩展名进行更具体的说明。

然后 autocrlf 可以在本地转换 Windows 程序的行尾。

在混合的 C#/C++/Java/Ruby/R、Windows/Linux 项目上,这运行良好。到目前为止没有任何问题。

于 2012-06-13T03:10:41.087 回答
2

我也有相同的症状,但由不同的事情引起。

我无法:

git checkout app.js //did nothing
git rm app.js //did nothing
rm -rf app.js //did nothing

即使在 git rm --cached app.js它标记为已删除和未跟踪的文件中,我也可以看到 app.js。但是当我再次尝试rm -rf app.js并执行git status时,它仍然向我显示“未跟踪”的文件。

经过与同事的几次尝试,我们发现它是由 Grunt 引起的!

由于Grunt已经打开,并且因为 app.js 是从其他几个 js 文件生成的,我们发现在每次使用 js 文件(也是这个 app.js)进行操作后,再次 grunt 重新创建 app.js。

于 2014-10-01T10:19:04.573 回答
2

当 repo 的贡献者在 Linux 机器上工作,或者具有 Cygwin 和文件权限的窗口发生更改时,也会发生此问题。Git 只知道 755 和 644。

此问题的示例以及如何检查它:

git diff styleguide/filename

diff --git a/filename b/filename
old mode 100644
new mode 100755

为避免这种情况,您应该确保使用正确设置 git

git config --global core.filemode false
于 2015-04-10T13:40:15.600 回答
2

这里有很多解决方案,我可能应该在想出自己的解决方案之前尝试其中的一些。无论如何,这里还有一个......

我们的问题是我们没有强制执行 endlines 并且存储库混合了 DOS / Unix。更糟糕的是,它实际上是这个位置的一个开源仓库,而且我们已经分叉了。决定由拥有 OS 存储库主要所有权的人将所有结尾行更改为 Unix,并做出包含 a.gitattributes以强制行结尾的提交。

不幸的是,这似乎引起了很像这里描述的问题,一旦完成 DOS-2-Unix 之前的代码合并,文件将永远被标记为已更改并且无法恢复。

在我对此进行研究的过程中,我遇到了 - https://help.github.com/articles/dealing-with-line-endings/ - 如果我再次遇到这个问题,我会首先尝试这个。


这是我所做的:

  1. 在意识到我遇到这个问题并且不得不中止之前,我最初进行了合并 - git reset --hard HEAD我遇到了合并冲突。我该如何中止合并?

  2. 我在 VIM 中打开了有问题的文件并更改为 Unix ( :set ff=unix)。dos2unix当然可以使用类似的工具

  3. 坚定的

  4. 合并masterin (master 有 DOS-2-Unix 修改)

    git checkout old-code-branch; git merge master

  5. 解决了冲突,文件又是 DOS,所以:set ff=unix在 VIM 中时必须这样做。(注意我已经安装了https://github.com/itchyny/lightline.vim这让我可以看到 VIM 状态行上的文件格式是什么)

  6. 坚定的。都整理好了!
于 2015-12-09T00:23:21.140 回答
2

我遇到的问题是 windows 不关心文件名的大小写,但 git 关心。所以 git 存储了文件的大小写版本,但只能签出一个。

于 2017-09-10T03:36:02.683 回答
2

我提交了所有更改,然后执行并撤消了提交。这对我有用

混帐添加。

git commit -m "随机提交"

git reset --hard HEAD~1

于 2018-02-07T10:49:29.947 回答
2

我有一个旧的冗余分支,具有不同的行尾。切换到这个让我有点卡住,直到我应用了一些 --force。

git checkout mainbranch --force

紧随其后的是迅捷git branch -D brokenbranch

于 2021-03-31T14:27:10.657 回答
1

如果您克隆存储库并立即看到待处理的更改,则存储库处于不一致状态。请不要* text=auto.gitattributes文件中注释掉。这是专门放在那里的,因为存储库的所有者希望所有文件都以 LF 行结尾一致地存储。

正如 HankCa 所述,遵循https://help.github.com/articles/dealing-with-line-endings/上的说明是解决问题的方法。简易按钮:

git clone git@host:repo-name
git checkout -b normalize-line-endings
git add .
git commit -m "Normalize line endings"
git push
git push -u origin normalize-line-endings

然后将分支合并(或拉取请求)到 repo 的所有者。

于 2016-12-05T20:44:02.653 回答
1

此页面上的其他内容均无效。这终于对我有用。显示没有未跟踪或已提交的文件。

git add -A
git reset --hard
于 2018-02-05T00:29:30.893 回答
1

对我来说,问题是执行命令时打开了 Visual Studio

git checkout <file>

关闭 Visual Studio 后,命令起作用了,我终于可以从堆栈中应用我的工作了。因此,请检查所有可能对您的代码进行更改的应用程序,例如 SourceTree、SmartGit、NotePad、NotePad++ 和其他编辑器。

于 2018-06-29T08:19:03.287 回答
0

我们公司也遇到过类似的情况。所提出的方法都没有帮助我们。作为研究的结果,问题暴露了。问题是在 Git 中有两个文件,它们的名称仅在符号寄存器中有所不同。Unix 系统将它们视为两个不同的文件,但 Windows 快疯了。为了解决这个问题,我们删除了服务器上的一个文件。之后,在 Windows 上的本地存储库中帮助了接下来的几个命令(以不同的顺序):

git reset --hard
git pull origin
git merge
于 2018-04-18T08:07:20.600 回答
0

我通过编辑.git / config解决了它,添加:

[branch "name_branch"]
    remote = origin
    merge = refs/heads/name_branch

然后我去了.git/refs/heads/name_branch并放置最后一次提交的identer code here

于 2018-11-16T15:34:11.800 回答
0

我是这样解决的:

  1. 复制你想要的正确代码的内容
  2. 从磁盘中删除导致问题的文件(无法恢复的文件)。现在您应该找到标记为被删除的同一文件的两个版本。
  3. 提交删除文件。
  4. 再次使用相同的名称创建文件并粘贴您在步骤 1 中复制的正确代码
  5. 提交新文件的创建。

这对我有用。

于 2019-02-03T17:18:51.690 回答
0

这里提出的一个解决方案不起作用,我发现该文件实际上是一些特殊字符的链接:

% ls -l StoreLogo.png
lrwxrwxrwx 1 janus janus 8 Feb 21 10:37 StoreLogo.png -> ''$'\211''PNG'$'\r\n\032\n'

% git status    
Changes not staged for commit:
    modified:   StoreLogo.png

% git rm --cached -r StoreLogo.png
rm 'src/GWallet.Frontend.XF.UWP/Assets/StoreLogo.png'

% git reset StoreLogo.png         
Unstaged changes after reset:
M   src/GWallet.Frontend.XF.UWP/Assets/StoreLogo.png

% git status                      
Changes not staged for commit:
    modified:   StoreLogo.png
于 2020-02-21T16:45:49.647 回答