git status 显示修改,git checkout — <file> 不会删除它们
-
19-09-2019 - |
题
我想删除对我的工作副本的所有更改。
跑步 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")
解决方案
有多个问题可能导致此行为:
订单结束归一化强>
我已经有这类问题了。归结到一点,自动转换的git CRLF到LF。这通常是通过在单个文件中混合行结束而引起的。该文件被归一化在索引中,但是当GIT中然后再次denormalizes它diff的它针对在工作树的文件,其结果是不同的。
但是,如果你想解决这个问题,你应该禁用的 core.autocrlf 的,改变所有行结束LF,然后重新启用它。或者你也可以这样做完全禁用它:
git config --global core.autocrlf false
代替的 core.autocrlf 的,你也可以考虑使用 .gitattribute
文件。通过这种方式,可以使用回购使用相同的规范化规则确保每个人,防止混行尾进入仓库。
也可以考虑设置的 core.safecrlf 的,如果你想要的git向您发出警告时,将执行一个不可逆的正常化警告。
在GIT中手册页这样说:
CRLF转换带有轻微的机会 的损坏数据。 autocrlf =真实意愿 转换CRLF期间LF和承诺 LF到结帐时CRLF。一份文件 包含LF和CRLF的混合物 提交之前不能被重新创建 通过饭桶。对于文本文件,这是 正确的事情:它可以解决线路 这样的结局,我们只有LF线 结局在库中。但对于 二进制文件是意外 列为文本转换可以 损坏的数据。
<强>不区分大小写的文件系统强>
在不区分大小写的文件系统,当具有不同外壳中的相同的文件名是在存储库中,GIT中试图检出两者,但只有一个文件系统上的结束。当GIT中试图比较第二个,这将其与错误的文件。
该解决方案要么是切换到非不区分大小写的文件系统,但此在大多数情况下是不可行的或重命名和提交于另一个文件系统中的文件中的一个。
其他提示
我在Windows上这个问题,但不准备考虑使用config --global core.autocrlf false
的后果我还没有准备放弃其他私人分支机构和好吃的东西在我的藏匿并用新的克隆启动。我只需要完成某项工作。现在
这为我工作,在您的git让完全重写你的工作目录的想法:
git rm --cached -r .
git reset --hard
(注意,只运行git reset --hard
不够好,也不是对文件的纯rm
作为注释原来的问题被提出的reset
前)
另一个可能对人们有用的解决方案,因为没有一个文本选项对我有用:
- 替换内容
.gitattributes
用一行:* binary
. 。这告诉 git 将每个文件视为它无法执行任何操作的二进制文件。 - 检查有问题的文件的消息是否已消失;如果不是你可以
git checkout -- <files>
将它们恢复到存储库版本 git checkout -- .gitattributes
恢复.gitattributes
文件恢复到初始状态- 检查文件是否仍未标记为已更改。
有关有这个问题,未来的人:有FILEMODE的变化也可以有相同的症状。 git config core.filemode false
将修复它。
这已经快把我逼疯了,特别是我couldn`t解决这个问题,没有任何网上找到了解决方案。下面是我如何解决它。在这里,因为这是一个同事的工作不能拿学分:)
问题来源:我的GIT中的初始安装是没有的窗口上的自动线转换。这引起了我的初始承诺GLFW是没有适当的行结束。
注意:这仅仅是一个局部的解决方案。接下来的家伙克隆回购 仍然会坚持这个问题。永久的解决方案可 这里找到: https://help.github.com/物品/处理与 - 行结束/#重新正火-A-库。
设定: Xubuntu的12.04 git仓库与GLFW项目
问题:无法重置GLFW文件。他们总是显示为已修改,不管是什么我试过了。
解决:
edit .gitattributes
Comment out the line: # text=auto
Save the file
restore .gitattributes: git checkout .gitattributes
我有同样的问题.bat文件(无法摆脱它,它在未跟踪文件)。 git的结帐 - 没有工作,也没有任何的建议,在此页上。只为我工作的事情是做的:
git stash save --keep-index
和然后删除藏匿:
git stash drop
得到了同样的问题两次!藏我做了,然后一些变化时,这两次试图弹出他们回来。 Could'nt弹出的变化,因为我有很多的文件,它被改变 - 但他们都没有!它们是完全一样的。
我想现在我已经尝试均无功而返上述解决方案。尝试之后的
git rm --cached -r .
git reset --hard
我现在得到了几乎所有在我的库中的文件进行修改。
在版本比较的文件,它说我已经删除了所有的线,然后再添加。
的干扰类。现在我将在以后避免积攒..
唯一的解决办法是克隆新的存储库,并重新开始。 (制造它最后一次)
我只能通过临时修复这个删除我的回购的.gitattributes文件(其定义* text=auto
和*.c text
)。
我跑git status
删除后和修改都消失了。 .gitattributes代替甚至放回来后,他们没有返回。
尝试做
git的结帐-f
这应该清除在当前工作本地回购所有的变化
有一致的行尾是一件好事。例如,它不会引发不必要的合并,尽管微不足道。我看到的Visual Studio创建具有混合的行结尾的文件。
另外一些程序诸如bash(在Linux)并要求.SH文件LF终止。
要确保这种情况,您可以使用gitattributes。它适用于仓库级别无论在什么autcrlf的值。
例如可以有这样.gitattributes: *文本=自动
您也可以按文件类型/扩展更具体的,如果它在你的情况下,事情并没有。
然后autocrlf可以转换行尾为Windows程序在本地。
在混合C#/ C ++ /爪哇/红宝石/ R,在Windows / Linux项目这个运作良好。没有问题为止。
我也相同的症状,但已经由不同的事引起的。
我无法:
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
已经接通,并且由于app.js已经从几个其他的JS文件生成,我们发现,与JS文件的每个操作后(也这个app.js)咕噜再次重新app.js。
也可能出现此问题。 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
这里有很多解决方案,在我想出自己的解决方案之前,我也许应该尝试其中的一些。无论如何,这里还有一个......
我们的问题是我们没有强制执行结束线,并且存储库混合了 DOS / Unix。更糟糕的是,它实际上是一个处于这个位置的开源存储库,并且我们已经分叉了。该决定是由那些拥有操作系统存储库主要所有权的人做出的,将所有终端更改为 Unix,并且提交的内容包括 .gitattributes
强制行结尾。
不幸的是,这似乎会导致类似于此处描述的问题,一旦完成 DOS-2-Unix 之前的代码合并,文件将永远被标记为已更改并且无法恢复。
在我对此的研究过程中,我遇到了 - https://help.github.com/articles/dealing-with-line-endings/ - 如果我再次遇到这个问题,我会首先尝试一下。
这是我所做的:
在意识到我遇到这个问题并不得不中止之前,我最初进行了合并 -
git reset --hard HEAD
(我遇到了合并冲突。我怎样才能中止合并?)我在 VIM 中打开了有问题的文件并更改为 Unix (
:set ff=unix
)。像这样的工具dos2unix
可以用来代替当然坚定的
合并了
master
中(主控有DOS-2-Unix改动)git checkout old-code-branch; git merge master
冲突已解决,文件再次进入 DOS,因此必须
:set ff=unix
当在 VIM 中时。(注意我已经安装了 https://github.com/itchyny/lightline.vim 这让我可以在 VIM 状态行上查看文件格式)- 坚定的。都整理好了!
我犯下的所有更改,然后做了,并撤消对提交。 这为我工作
GIT中添加。
git的承诺-m “随机提交”
GIT中的复位 - 硬HEAD〜1
如果您克隆库,并立即看到挂起的更改,则该仓库是在不一致的状态。请不要从* text=auto
文件中注释掉.gitattributes
。这放在那里,特别是因为仓库的所有者希望与LF行结束一致性地存储所有文件。
正如HankCa指出,下面就 HTTPS的说明://帮助.github.com /用品/处理与 - 行结束/ 是去解决问题的方式。容易按钮:
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中存储在该文件的下和大写版本,但只能检出一个。
闲来无事此页面上的工作。这终于为我工作。显示没有未跟踪,或COMMITED文件。
git add -A
git reset --hard
有关我的问题是,Visual Studio中正在执行的命令时打开
git checkout <file>
关闭Visual Studio中后,命令工作,我终于可以从堆栈中应用我的工作。因此,检查,可以更改您的代码的所有应用程序,例如SourceTree,SmartGit,记事本,记事本+ +和其他编辑。
我们在我们的公司面临类似的情况。所提出的方法没有没有帮助我们。作为研究的结果,问题就显现出来。的的事情是,在GIT中有两个文件,它们的名称中的符号的寄存器只不同。 Unix的系统认为它们是两个不同的文件,但Windows快要疯了。:要解决这个问题,我们删除了服务器上的文件之一。之后,在Windows上的本地资源库有助于接下来的几个命令(以不同的顺序):
git reset --hard
git pull origin
git merge
我前几次遇到了这个问题。我目前正在开发由我的雇主提供的Windows 10的机器上。如今,这个特殊的git行为是由我创建从我的“开发”分支一个新的分支造成的。出于某种原因,经过我切换回“开发”分支,某些看似随机的文件坚持并显示为“修饰的”在“git的状态”。
此外,在这一点上我不能签其他分支,所以我坚持我的“开发”分支。
这是我做过什么:
$ git log
我注意到,我从所创建的新的分支“发展”今天早些时候表示第一“提交”消息时,在端部被引用“HEAD - >开发,起源/发展,产地/ HEAD,的的侧枝-i的创建的同期今天强>”。
由于我没有真的需要它,我删除了:
$ 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
这可能和工作,我一定会下一次我碰到这个问题,来试试吧。
我解决它通过编辑的.git /配置,增加:
[branch "name_branch"]
remote = origin
merge = refs/heads/name_branch
然后我去的.git /参/头/ name_branch
并放置最后commitenter code here
的id
我是这样解决的:
- 复制您想要的正确代码的内容
- 从磁盘中删除导致问题的文件(无法恢复的文件)。现在您应该会发现同一文件的两个版本都标记为已删除。
- 提交文件删除。
- 使用相同的名称再次创建文件,然后粘贴您在步骤 1 中复制的正确代码
- 提交新文件的创建。
这对我有用。