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

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 checkout -f

这将清除当前工作的本地回购中的所有更改

其他回答

这一页上的其他内容都不起作用。这最终对我有用。没有显示未跟踪或已提交的文件。

git add -A
git reset --hard

有一致的行尾是件好事。例如,它不会触发不必要的合并,尽管这是微不足道的。我曾经见过Visual Studio用混合行结尾创建文件。

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

为了确保发生这种情况,可以使用gitattributes。不管autcrlf的值是什么,它都在存储库级别上工作。

例如,你可以有这样的.gitattributes: *文本=汽车

如果对您的情况有影响,您还可以更具体地指定每个文件类型/扩展名。

然后,selff可以在本地转换Windows程序的行结束符。

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

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

通常情况下,在GIT中使用以下两个命令可以很好地清除你所有的修改和新文件(注意,这将删除你所有的新文件和你可能创建的文件夹,并将所有你修改过的文件恢复到你当前提交的状态):

$ 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行为是由我从“develop”分支创建一个新分支引起的。出于某种原因,当我切换回“开发”分支后,一些看似随机的文件仍然存在,并在“git状态”中显示为“已修改”。

另外,在那个时候我不能签出另一个分支,所以我被困在了“开发”分支上。

这就是我所做的:

$ git log

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

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

$ 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列表将显示隐藏的变化,因为我有几个,不需要任何我的存储,我做$ git stash清除删除所有的存储。

注意:在我之前,我还没有尝试过别人建议我做的事情:

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

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

有多种问题会导致这种行为:

行结束归一化

我也遇到过这种问题。归根结底是git自动将crlf转换为lf。这通常是由单个文件中混合的行结束符引起的。该文件在索引中得到了规范化,但是当git再次对其进行反规范化以与工作树中的文件进行区分时,结果是不同的。

但如果你想解决这个问题,你应该禁用core。将所有行结束改为lf,然后再次启用它。或者你可以通过以下方法完全禁用它:

git config --global core.autocrlf false

而不是核心。独裁,你也可以考虑使用.gitattributes文件。通过这种方式,您可以确保使用repo的每个人都使用相同的规范化规则,防止混合的行尾进入存储库。

还要考虑设置核心。如果您希望git在执行不可逆规范化时发出警告,则使用Safecrlf。

git的手册上写着:

CRLF转换有轻微的可能性 破坏数据。autocrlf = true将 在提交和期间将CRLF转换为LF 结帐时LF到CRLF。一个文件 它含有LF和CRLF的混合物 之前无法重新创建提交 git。对于文本文件,这是 正确的做法是:修正直线 这样我们就只有LF线 存储库中的结尾。但对于 二进制文件 分类为文本的转换可以 腐败的数据。

不区分大小写的文件系统

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

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