git status shows modifications, git checkout — <file> doesn't remove them
我想删除对工作副本的所有更改。
运行
我所做的一切似乎都无法删除这些修改。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | 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") |
我在Windows上遇到了这个问题,但不准备调查使用
这对我很有用,因为你让Git完全重写你的工作目录:
1 2 | git rm --cached -r . git reset --hard |
(注意,仅仅运行
有多个问题可导致这种行为:
行尾规范化
我也遇到过这样的问题。归根结底是Git自动将CRLF转换为LF。这通常是由单个文件中的混合行结尾引起的。文件在索引中被规范化,但是当Git再次将其反规范化以将其与工作树中的文件进行比较时,结果是不同的。
但是如果你想解决这个问题,你应该禁用core.autocrlf,将所有行尾改为lf,然后再次启用它。或者您可以通过执行以下操作完全禁用它:
1 | git config --global core.autocrlf false |
您也可以考虑使用
还可以考虑将core.safecrlf设置为warn,如果您希望Git在执行不可逆规范化时警告您。
Git手册页上说:
CRLF conversion bears a slight chance
of corrupting data. autocrlf=true will
convert CRLF to LF during commit and
LF to CRLF during checkout. A file
that contains a mixture of LF and CRLF
before the commit cannot be recreated
by git. For text files this is the
right thing to do: it corrects line
endings such that we have only LF line
endings in the repository. But for
binary files that are accidentally
classified as text the conversion can
corrupt data.
号
不区分大小写的文件系统
在不区分大小写的文件系统上,当存储库中存在具有不同大小写的同一个文件名时,Git会尝试同时签出这两个文件名,但只有一个文件名会在文件系统中结束。当git试图比较第二个文件时,它会将其与错误的文件进行比较。
解决方案要么是切换到不区分大小写的文件系统,但在大多数情况下这是不可行的,要么是重命名并提交另一个文件系统上的一个文件。
另一个可能适用于人的解决方案,因为没有一个文本选项适用于我:
对于未来有此问题的人:文件模式更改也可能有相同的症状。
这让我发疯了,尤其是如果没有任何在线解决方案,我就无法解决这个问题。我就是这样解决的。不能在这里取学分,因为这是同事的工作:)
问题来源:我最初安装的Git在Windows上没有自动换行。这导致我对GLFW的初始承诺没有适当的行尾。
Note: This is only a local solution. The next guy cloning the repo
will still be stuck with this problem. A permanent solution can be
found here:
https://help.github.com/articles/dealing-with-line-endings/#re-normalizing-a-repository.
号
设置:徐本图12.04GLFW项目的Git回购
问题:无法重置glfw文件。不管我做了什么,它们总是显示为修改过的。
解决了的:
1 2 3 4 5 6 7 | edit .gitattributes Comment out the line: # text=auto Save the file restore .gitattributes: git checkout .gitattributes |
号
我有一个.bat文件有同样的问题(无法在未跟踪的文件中消除它)。Git签出——不起作用,这个页面上的任何建议也不起作用。唯一对我有用的就是:
1 | git stash save --keep-index |
。
然后删除隐藏:
1 | git stash drop |
有两次同样的问题!这两次我都藏了一些我做的修改,然后试图把它们放回去。无法弹出更改,因为我有很多文件被更改了--但没有!它们完全一样。
我现在认为我已经尝试过上述所有的解决方案,但没有成功。在尝试之后
1 2 | git rm --cached -r . git reset --hard |
。
我现在几乎修改了我存储库中的所有文件。
当比较文件时,它说我已经删除了所有行,然后再次添加它们。
有点烦人。我现在将避免在将来藏匿。
唯一的解决方案是克隆一个新的存储库并重新启动。(上次做的)
我只能通过临时删除repo的.gitattributes文件(定义了
删除之后,我运行了
尝试做一个
git checkout -f
号
这将清除当前有效的本地回购的所有变化。
有一致的行尾是一件好事。例如,它不会触发不必要的合并,尽管是微不足道的。我见过Visual Studio创建带有混合行结尾的文件。
此外,一些程序(如Linux上的bash)确实要求.sh文件是LF终止的。
要确保发生这种情况,可以使用gitattributes。无论autcrlf的值是什么,它都在存储库级别上工作。
例如,您可以有这样的.gitattributes:*文本=自动
如果每个文件类型/扩展名在您的案例中确实很重要,那么您也可以对其进行更具体的描述。
然后autocrlf可以在本地转换Windows程序的行尾。
在一个混合的C/Y/C++/Java/Ruby/R,Windows/Linux项目下,这是一个很好的工作。到目前为止没有问题。
我也有同样的症状,但是由不同的事情引起的。
我不能:
1 2 3 | git checkout app.js //did nothing git rm app.js //did nothing rm -rf app.js //did nothing |
即使在
经过与同事的几次尝试,我们发现这是由咕噜声引起的!
由于
这里有很多解决方案,在我想出自己的解决方案之前,我可能应该尝试一下。不管怎样,这里还有一个…
我们的问题是,我们没有对端点的强制执行,存储库混合了DOS/Unix。更糟糕的是,它实际上是一个开源回购,在这个位置,我们已经分叉。那些拥有OS存储库主要所有权的人决定将所有的结束行更改为Unix,并提交了一个包含
不幸的是,这似乎导致了类似这里描述的问题:在DOS-2-Unix完成之前,一旦代码合并,文件将永远标记为已更改,无法恢复。
在我的研究过程中,我遇到了-https://help.github.com/articles/dealing-with-line-endings/-如果我再次面对这个问题,我将首先尝试这个问题。
以下是我所做的:
在意识到我有这个问题之前,我首先做了一个合并,然后不得不中止这个合并——
我在vim中打开了有问题的文件,并改为unix(
坚信的
在中合并了
埃多克斯1〔14〕
解决了冲突,文件又是DOS文件,所以在VIM中时,必须对
如果克隆存储库并立即看到挂起的更改,则存储库处于不一致状态。请不要从
正如汉卡所说,遵循https://help.github.com/articles/dealing-with-line-endings/上的说明是解决问题的方法。简单按钮:
1 2 3 4 5 6 | 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 |
然后将分支合并(或拉取请求)到回购的所有者。
我遇到的问题是Windows不关心文件名大小写,但Git关心。所以Git存储了一个文件的大小写版本,但只能签出一个。
我提交了所有的更改,然后在提交时执行并撤消了这些更改。这对我有用
Git添加。
git commit-m"随机提交"
git reset--硬头~1
对我来说,问题是在执行命令时打开了Visual Studio
埃多克斯1〔2〕
关闭Visual Studio后,该命令起作用,我终于可以从堆栈中应用我的工作。因此,检查所有可以更改代码的应用程序,例如sourcetree、smartgit、notepad、notepad++和其他编辑器。
当repo的贡献者在Linux机器上工作时,或者具有cygwin和文件权限的Windows发生更改时,也会发生此问题。吉特只知道755和644。
此问题的示例及其检查方法:
1 2 3 4 5 | git diff styleguide/filename diff --git a/filename b/filename old mode 100644 new mode 100755 |
号
为了避免这种情况,您应该确保使用
1 | git config --global core.filemode false |
我是这样解决的:
这就是我的工作。
这个页面上的其他内容都不起作用。这终于对我起作用了。没有显示未跟踪或提交的文件。
1 2 | git add -A git reset --hard |
号
我们公司也面临同样的情况。所有建议的方法都没有帮助我们。研究的结果揭示了这个问题。问题是在Git中有两个文件,它们的名称只在符号寄存器中有所不同。Unix系统将它们视为两个不同的文件,但Windows正变得疯狂。为了解决这个问题,我们删除了服务器上的一个文件。之后,在Windows上的本地存储库中帮助执行以下几个命令(按不同的顺序):
1 2 3 | git reset --hard git pull origin git merge |
我以前碰到过这个问题。我目前正在开发雇主提供的Windows10计算机。今天,这个特定的Git行为是由我从我的"开发"分支创建一个新分支引起的。出于某种原因,在我切换回"开发"分支之后,一些看似随机的文件持续存在,并在"git状态"中显示为"已修改"。
而且,在那个时候我不能签出另一个分支,所以我被困在了我的"开发"分支上。
我就是这样做的:
1 | $ git log |
。
我注意到,我今天早些时候从"开发"创建的新分支显示在第一条"提交"消息中,在"head->develop,origin/develop,origin/head,the-branch-i-created-early-today"结尾处引用。
因为我并不真正需要它,所以我删除了它:
1 | $ git branch -d The-branch-i-created-earlier-today |
更改的文件仍在显示,因此我做到了:
1 | $ git stash |
。
这解决了我的问题:
1 2 3 4 5 | $ git status On branch develop Your branch is up to date with 'origin/develop'. nothing to commit, working tree clean |
。
当然,
注意:我还没有试着按照别人在我之前的建议做:
1 2 | $ git rm --cached -r . $ git reset --hard |
这也可能有效,下次遇到这个问题时我一定要试试。
我通过编辑.git/config解决了这个问题,并添加了:
1 2 3 | [branch"name_branch"] remote = origin merge = refs/heads/name_branch |
。
然后我去了.git/refs/heads/name_分支机构并将最后一个提交的OCx1〔5〕的ID