无法解决的Git错误:以下未跟踪的工作树文件将被结帐覆盖

时间:2012-01-12 17:14:00

标签: git branch

我在Visual Studio 2010中单独使用Git作为我的本地软件项目。最近我创建了一个新的分支来对其中一个对话窗口进行更大的重构。我做了以下修改:

  • 将Form1重命名为Form1a(包括所有依赖文件)
  • 添加新的Form1

我将这个更改检查到了分支,比如表单重构。有趣的是,Git并没有注意到我将文件Form1.cs重命名为Form1a.cs并创建了一个全新的,完全不同的Form1.cs,但它发现了一个新的Form1a.cs文件并发现了它之间的很多差异。以前和新的Form1.cs文件。这当然会导致完全无用的差异,但在这种情况下我不在乎,只要最终处理完所有文件。

然后我换回主人做了一些其他的小改动。没有任何冲突。到现在为止,一切正常。

今天,我想切换回我的分支表格 - 重构以继续这项工作。但我得到的是以下信息:

git.exe checkout    form-refactoring

Aborting
error: The following untracked working tree files would be overwritten by checkout:
Form1.Designer.cs
Please move or remove them before you can switch branches.

应该是什么?提到的文件不是未跟踪的。既不在主分支中,也不在形式重构分支中。它是两个分支的一部分,但一个不是另一个分支的后代。如果我删除它会发生什么,它会好转吗?如果我现在删除了某些东西,我不相信Git会带回正确的文件。除了我提到的Git操作之外,我根本没有使用任何文件,那么我为什么要玩任何文件来继续使用Git操作呢? Git打破了它,Git现在应该处理它了!

现在,我无法继续工作,因为我无法切换分支机构。有一个简单的解决方案吗?

Git版本是1.7.6,TortoiseGit是1.7.3。

5 个答案:

答案 0 :(得分:17)

未设置core.ignorecase配置选项,并且Visual Studio已重命名.Designer.cs文件以防万一,从大写切换到较低的“D”(反之亦然)。这到底是个问题。在将选项设置为true后,我花了一些文件历史记录分解(删除并重新添加文件)来解决此错误。实际上,该选项是在一台计算机上设置的,但是在克隆存储库时,设置以某种方式丢失了。然后命运只是等待VS重命名该文件才能抓住我。

因此,在Windows上,您始终需要确保在执行任何初始化/克隆操作后这两个设置都是正确的:

git config core.ignorecase true
git config core.autocrlf false

有些工具(TGit,gitscc等)似乎做得不对。这对于Windows上的正常操作是绝对必要的,但是Git并不关心它们是否设置不正确而只是让你偶然发现它们并没有告诉你原因。在这件事情上,它有助于说谎,因为它很有用。

答案 1 :(得分:0)

如果有可能丢失数据,Git不允许切换分支。

通常,在切换到另一个分支之前提交所有更改是个好主意。 如果您完全确定没有进行此更改,则可以使用

重置工作树
git reset --hard HEAD

命令。但我强烈建议不要这样做。使用

git stash

命令将您的更改存储到内部存储。在这种情况下,您始终可以恢复数据。

答案 2 :(得分:0)

首先, Git不是骗你的。该文件确实在分支中被跟踪,并且确实存在于工作树中,并且实际上是未跟踪的。

鉴于您在其他地方的评论中建议该文件不会出现在差异中,甚至不会出现在git status中,这听起来就像是您已将其添加到您的gitignore中(可能是通过通配符模式无意中添加)。我知道你说你没有,但是如果它没有在git status的输出中显示为未跟踪的文件,那么它就不会被跟踪并被忽略。要验证这一点,您可以列出.gitignore忽略的所有文件:

git ls-files -i --exclude-from=.gitignore

您还可以列出所有未跟踪的文件,忽略与否:

git clean -xdn

(你好像说你非常肯定这个文件是被跟踪的 - 如果确实是这样的话,git show HEAD:path/to/file会显示文件的已提交内容。但是,我怀疑这会告诉“致命” :'HEAD'中不存在路径'path / to / file'。)

另一种验证文件是否未跟踪和忽略的方法只是重命名,然后查看git status是否将其报告为已删除;如果没有,则没有跟踪。

假设这确实列出了有问题的文件,您应该检查工作树中的文件。您可以使用git show other-branch:path/to/file查看其他分支的文件版本,以进行比较。如果您对工作树中不需要该版本感到满意,只需将其删除即可。如果您担心可能需要它,请将其重命名或将其移出目录。如果你意识到你确实需要它,你应该弄清楚忽略模式忽略它,删除它,添加它,然后提交它。在任何情况下,一旦你处理完文件,你就可以切换分支。

答案 3 :(得分:0)

这解决了我的问题:

rm .git/fs_cache

答案 4 :(得分:-1)

似乎XXX分支(表单重构)包含此文件但YYY不包含此文件。现在你正试图从分支YYY移动到XXX。 Git担心你只是忘记添加文件,所以它不允许移动到另一个分支。

使用

git status

确定此文件(Form1.Designer.cs)是否未跟踪。在这种情况下,只需提交它,然后您就可以安全地移动到另一个分支