git status显示修改,git checkout - <file>不删除它们</file>

时间:2010-01-06 21:31:50

标签: git revert git-status working-copy

我想删除对工作副本的所有更改 正在运行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")

24 个答案:

答案 0 :(得分:191)

我在Windows上遇到了这个问题,但是我没有准备好调查使用config --global core.autocrlf false的后果我也不准备在我的藏匿处放弃其他私人分支和好东西并从一个新的克隆开始。我只需要完成一些事情。现在

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

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

(请注意,仅运行git reset --hard不够好,rm之前的文件上的reset仍然是原始问题的评论中建议的

答案 1 :(得分:118)

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

行结束规范化

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

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

git config --global core.autocrlf false

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

另外考虑设置 core.safecrlf 以警告您是否希望git在执行不可逆的规范化时发出警告。

git manpages这样说:

  

CRLF转换带来轻微机会   破坏数据。 autocrlf = true会   在提交期间将CRLF转换为LF   结账时LF到CRLF。一份文件   含有LF和CRLF的混合物   在无法重新创建提交之前   通过git。对于文本文件,这是   正确的事情:它纠正线   结局使我们只有LF线   存储库中的结尾。但对于   意外的二进制文件   归类为文本的转换可以   腐败的数据。

不区分大小写的文件系统

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

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

答案 2 :(得分:90)

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

  1. .gitattributes的内容替换为一行:* binary。这告诉git将每个文件视为二进制文件,它无法执行任何操作。
  2. 检查违规文件的消息是否消失;如果不是,您可以git checkout -- <files>将它们恢复到存储库版本
  3. git checkout -- .gitattributes.gitattributes文件恢复到初始状态
  4. 检查文件是否仍未标记为已更改。

答案 3 :(得分:66)

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

答案 4 :(得分:31)

这让我很疯狂,特别是如果没有网上找到的任何解决方案,我无法解决这个问题。这是我如何解决它。不能在这里获得学分,因为这是同事的工作:)

问题的根源:我最初安装的git没有在Windows上进行自动换行。这导致我对GLFW的初始提交没有正确的行结束。

  

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

设定: Xubuntu 12.04 git repo with glfw project

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

解决:

edit .gitattributes

Comment out the line:    # text=auto

Save the file

restore .gitattributes:   git checkout .gitattributes

答案 5 :(得分:11)

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

git stash save --keep-index

然后删除藏匿处:

git stash drop

答案 6 :(得分:5)

两次得到同样的问题!两次隐藏我做的一些改变,然后试图弹回它们。因为我有大量的文件被更改,所以无法弹出更改 - 但它们不是!它们完全一样。

我现在认为我已经尝试了以上所有解决方案而没有成功。尝试后

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

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

在对文件进行差异化时,它说我删除了所有行,然后再次添加它们。

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

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

答案 7 :(得分:4)

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

删除后我运行*.c text,修改消失了。即使在.gitattributes被放回原位后,他们也没有回来。

答案 8 :(得分:3)

尝试做

  

git checkout -f

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

答案 9 :(得分:2)

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

另外一些程序如bash(在linux上)确实要求.sh文件是LF终止的。

要确保发生这种情况,您可以使用gitattributes。无论autcrlf的值是什么,它都可以在存储库级别上运行。

例如,您可以像这样使用.gitattributes:     * text = auto

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

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

在混合的C#/ C ++ / Java / Ruby / R,Windows / Linux项目中,这种方法运行良好。到目前为止没有问题。

答案 10 :(得分: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重新创建应用程序。 js再次。

答案 11 :(得分:2)

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

我们的问题是我们没有对终结点进行强制执行,而且存储库中混合了DOS / Unix。更糟糕的是它实际上是这个位置的开源回购,我们已经分叉了。由拥有操作系统存储库主要所有权的人做出决定,将所有终结符更改为Unix,并且提交了包含.gitattributes以强制执行行结束的提交。

不幸的是,这似乎引起了类似于此处描述的问题,一旦在DOS-2-Unix之前完成代码合并,文件将永远标记为已更改且无法还原。

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

这是我做的:

  1. 我在最初完成合并之后才意识到我遇到了这个问题而不得不中止 - git reset --hard HEADI ran into a merge conflict. How can I abort the merge?

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

  3. 致力于

  4. 合并master(主人有DOS-2-Unix更改)

    git checkout old-code-branch; git merge master

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

  6. 提交。全部排序!

答案 12 :(得分:1)

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

git checkout mainbranch --force

接着是一个快速的git branch -D brokenbranch

答案 13 :(得分:1)

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

git checkout <file>

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

答案 14 :(得分:1)

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

git add。

git commit -m&#34;随机提交&#34;

git reset --hard HEAD~1

答案 15 :(得分:1)

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

答案 16 :(得分:1)

如果克隆存储库并立即查看挂起的更改,则存储库处于不一致状态。请勿在{{1​​}}文件中注释* text=auto。特别是因为存储库的所有者希望所有文件与LF行结尾一致地存储。

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

.gitattributes

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

答案 17 :(得分:1)

当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

答案 18 :(得分:0)

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

git add -A
git reset --hard

答案 19 :(得分:0)

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

"%f"

答案 20 :(得分:0)

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

此外,那时我无法签出另一个分支,所以我陷入了“开发”分支。

这就是我所做的:

$ git log

我注意到我今天早些时候从“ develop”创建的新分支显示在第一条“ commit”消息中,并在末尾引用“ HEAD-> develop,origin / develop,origin / HEAD, -branch-i-created-today-day ”。

由于我确实不需要它,因此将其删除:

$ 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

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

答案 21 :(得分:0)

我通过编辑.git / config并添加以下内容来解决它:

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

然后我去了.git / refs / heads / name_branch 并放置上次提交的ID enter code here

答案 22 :(得分:0)

我这样解决了:

  1. 复制所需的正确代码的内容
  2. 从磁盘上删除引起问题的文件(无法还原的文件)。现在您应该找到标记为已删除的同一文件的两个版本。
  3. 删除文件。
  4. 再次使用相同的名称创建文件,然后粘贴您在步骤1中复制的正确代码。
  5. 提交新文件的创建。

那对我有用。

答案 23 :(得分:0)

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

{{1}}