当切换分支时,Git会提示“以下未跟踪的工作树文件将被覆盖”。

13

我在远程裸仓库hub中有一个名为develop的分支,在我的本地git存储库(用户poomalai)中有一个develop分支的检出副本。

我从另一个检出副本(用户raj)中删除了(git rm --cached)一个文件(Mydirectory/myfile.php),并将其推送到中央仓库。

现在,当我从中央仓库拉取更改时(用户poomalai),它可以正常工作,并且我在git日志中看到提交消息file deletion

我已将文件添加到了.gitignore文件中(用户poomalai)。
现在,我在我的本地存储库(用户poomalai)中创建了该文件。

现在,该文件不再受版本控制,对该文件的更改也不会被git跟踪。

但是,当我尝试切换到其他分支时,会提示以下错误:

error: The following untracked working tree files would be overwritten by checkout:
Mydirectory/myfile.php
Please move or remove them before you can switch branches.
Aborting

当我使用Linux的rm命令删除文件后,我就能够切换分支。
如果我再次创建该文件,它会再次抛出相同的错误。
我需要该文件位于目录中,但不应被git跟踪。

我尝试了以下命令:

git rm  

致命错误:路径规范'diamonds_webservice/dbconnect.php'没有匹配到任何文件

git gc
git reset --hard HEAD
git pull

什么都不起作用。请有人帮帮我。

3个回答

9
这可能是因为文件被添加到“目标分支”中的存储库中。
请确保从“目标分支”中使用git rm命令删除该文件,然后尝试切换分支。

正如@CharlesB所说,Git这样做是为了确保数据完整性,在切换目录时不会丢失任何东西。


1
太好了,这很有效。所以我必须从所有在文件从中心删除之前创建的分支中git rm该文件。谢谢。 - Poomalairaj
4
我们如何从无法checkout的分支中 "git rm" 一个文件? - brazorf
1
因此,您提出了一个可以完成的理论想法,但并没有具体说明如何实现。按照目前的写法,这不是一个有用的答案,而更像是一种提示或评论。请编辑以向其他不熟悉Git的人显示如何应用您的建议来实现解决方案。谢谢! - SherylHohman

5
很好,git会提醒你这一点,因为切换到一个没有删除该文件的分支将会删除它。
所以你做得很对:在检出将要删除该文件的分支之前,先删除它(或重命名)。
因此,git只是在在覆盖你的数据之前关心你的数据。因为它没有版本控制,所以在检出后你将无法恢复它。

1
但每次我都需要重新命名文件等,这是一项繁琐的任务。为什么Git不只是忽略该文件,不跟踪并且不中止分支切换呢? - Poomalairaj
1
由于分支切换将覆盖(或删除)未版本化的数据(即您现在未跟踪的文件)。 - CharlesB
你可以使用类似 rm <backtick>git checkout xyz 2>&1 | sed "s/^[^\t].*/ /g" <backtick>(其中<backtick>是shift-~)来自动删除那些文件,以解决由于未跟踪的文件而导致的文件覆盖警告。 - Jamie Pate
1
@pooamlairaj 是的,这是因为文件需要从每个分支中删除,然后提交此更改。.gitignore文件也是快照的一部分。 我理解这很繁琐(虽然有自动化的方法),但是能够保存文件系统的快照,使得一个分支(或复制的仓库)中的更改不会自动(和悄无声息地)影响其他分支(和仓库克隆),这就是版本控制的强大之处。一旦你能够理解幕后发生了什么以及为什么,它实际上是有意义的。祝一切顺利。 - SherylHohman

0
唯一对我起作用的方法: 在android studio中 - 转到事件日志 - 单击“查看它们”超链接。 - 然后手动点击减号栏以删除弹出窗口中的文件。
(因为只有4-5个文件,我先重命名了这些文件) 由于第一次尝试时未删除某些项目,我不得不再做一次...

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