即使所有更改都已提交,Git 仍要求我在切换到主分支之前提交或存储更改?

40
我本地有两个分支:master和Berislav。后者是当前活跃的分支,我已经提交了所有更改。当我尝试检出到master时,会收到以下消息:

错误:您对以下文件的本地更改将被覆盖:[列出在活动分支中更改的文件列表]。请在切换分支之前提交更改或隐藏它们。放弃

但是,我尝试的所有其他操作——提交、状态、合并——都告诉我没有要提交的内容(工作目录干净)。我需要做什么才能到达我的master分支?

编辑:当我尝试git stash时,我得到:

错误:将未修改的[file path]提供给diffcore

适用于上述错误中列出的所有文件。


https://dev59.com/DVjUa4cB1Zd3GeqPPDXH和http://stackoverflow.com/questions/6638937/switching-branches-in-git-when-will-i-get-you-have-local-changes-cannot-switch这些问题的答案可能会有帮助,另外https://dev59.com/-ms05IYBdhLWcg3wFN4h也是可能的替代方法。 - VonC
6
git status 的输出是什么? - manojlds
+1 给 manojlds。这是解决这个问题的有用信息。 - Noufal Ibrahim
只是:#在分支Berislav上 没有要提交的内容(工作目录干净) - Berislav Lopac
你使用哪个操作系统?如果是Windows,你是否设置了autocrlf? - Rudi
这里似乎提供了一些相关信息:https://dev59.com/QW025IYBdhLWcg3wW0oc - Berislav Lopac
8个回答

41

今天我遇到了类似的问题。 git status 没有列出检出报告中提到的文件。 我执行了以下操作:

git checkout -- path/to/file

这会撤销对文件所做的任何更改。

一种更简单的方法来撤销当前工作目录下所有未暂存的更改[1]:

git checkout -- .

[1] - 请注意,您将失去其他未暂存的更改(如果有)。 如果您不知道自己在做什么,请备份您正在处理的文件 :)


这真的帮了我大忙。git checkout -f branch不起作用,但这个方法解决了问题。 - rurp
有时这并没有帮助。在一个实际的案例中,一个文件的行结尾从CRLF变成了LF,.gitattributes包含*.sh text eol=lf但是git checkout -- .没有用新的不带CR的版本替换它们。 - Daniel Alder

39

就是这么简单:

git stash
git stash pop

当您运行git stash时看到的“错误”并不是什么需要担心的事情。这只是Git认识到该文件没有任何未提交的更改。


13

我在进行克隆时遇到了类似的问题。我只需使用--force (-f) 标记来强制检出即可。

git checkout --force some_branch 

也许不是解决你正在修改的仓库问题的最佳方式,但我确信自己没有进行任何更改,只想切换分支。


对我来说也是一样。我尝试了所有选项,但这个可以正常工作。谢谢@Adam Bowen。 - anant prajapati

11

将有问题的文件移动到其他位置。然后从您的树中删除该有问题的文件。再次pull。然后将您的有问题的文件的更改与您刚刚pull的文件进行比较。这是一种hack方法,但它有效。


4
这种东西让 Git 获得了使用难度高的声誉。 - Matt Jacobsen

2
看起来你的工作副本中有未被追踪的文件,但这些文件在另一个分支上是被追踪的。Git拒绝切换到另一个分支,因为当前未被追踪的本地文件将被另一分支上的文件覆盖。
现在你可以:
- 如果这些文件与当前分支相关,请将它们添加到当前分支。 - 如果不需要这些文件,请将其删除。

另一个选择是使用 git stash 将文件保存在存储区中,并在将来的某个时候恢复它们 (git stash pop)。 - Grizzly
问题在于列出的文件已被跟踪,并且当前分支报告为最新状态。只有在尝试检出主分支时才会出现此问题。 - Berislav Lopac
@BerislavLopac,你的repo(http://progit.org/book/ch7-2.html)中是否有smudge/clean过滤器?或者启用了crlf替换设置(https://dev59.com/GnE85IYBdhLWcg3wViA4#2825829)? - Rudi
@BerislavLopac 至少为了得到一个可用的主分支,你也可以将你的仓库克隆到一个新的工作副本中(并可选择在那里合并你当前的分支)。 - Rudi
我曾经遇到过同样的问题。我的文件被放在了gitignore中,因此git不允许我检出之前的目标分支。我将该文件从文件夹中移除后,问题得到了解决。 - John Kuriakose

1

与@JohnHammink的答案非常相似,但是这里是解决方案。

解决方案

  1. 将文件移动到另一个目录。
  2. 提交更改(它可能会显示你刚刚删除了两个文件)。
  3. 再次将文件添加到目录中。
  4. 提交(您应该能够看到只有一个文件被提交)。

在我的情况下,这是因为一个文件仅更改大小写而重命名。例如fooViewModel改为FooViewModel。Git一直认为同一个文件实际上是两个不同的文件。

我认为这与Unix区分大小写有关,而Windows则没有真正区分大小写。

希望这可以帮助到您。


我将文件移动到另一个位置,然后成功切换了分支。 - Mario Galván

0

我之前也遇到了同样的问题,并且在Linux上解决了它:

git config --global core.autocrlf input

0

正如消息所示,使用 --force 选项重新运行命令。

flutter upgrade --force

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接