从分支中删除文件,但保留在主分支中的 Git 操作

37

我创建了一个新分支

git checkout -b mybranch

然后我从中删除一个文件

git rm --cached myfile.txt

但是我想把它保留在主分支上;为什么当我切换到主分支时

git checkout master
我收到一个错误信息:"error: The following untracked working tree files would be overwritten by checkout: file.txt",如果我强制进行检出操作。
git checkout master -f

文件已从文件系统中删除?

我确定我错过了什么,但我只想从一个分支中删除文件,而不是从主分支中删除,但当我切换到主分支时,似乎git想要合并这个分支。

之所以使用git rm而不是gitignore,是因为该文件已经被提交。

3个回答

29
如果您想要在 master 分支上继续跟踪 myfile.txt 文件,但从 mybranch 分支中删除它,那么您只需要删除该文件并提交删除操作即可。
git checkout -b mybranch
rm myfile.txt
git commit -am "delete myfile.txt"

现在当你检出master时,你会看到你的文件被返回了,而当你检出mybranch时,它又消失了。

请注意,如果你将mybranch合并到master中,它也将在master上被删除。


2
谢谢,它可以工作了,但在提交之前我需要添加一个“git add -u”或使用“git rm”而不是rm。如果您编辑您的答案,我会接受它。 - Eugenio
1
@Eugenio 谢谢你发现了这个问题!我编辑了我的答案,使用 git commit -am 命令将添加所有更改,包括已删除的文件。 - Jeff Puckett
2
我简直不敢相信这个答案得到了8票… 我认为问题是…是否有一种方法可以将文件限制在主分支中而不是其他分支中…例如,秘密信息可以保存在主分支的属性文件中,只有管理员才能访问主分支。 - Nitin Jha

6

因为文件还没有提交,所以git将其视为未被跟踪。在切换分支之前,您必须提交更改。

所以您创建了一个分支并对该分支进行了更改。当您尝试切换回 master 时,git会禁止此操作,因为存在尚未提交的更改(或明确忽略的更改;(这实际上是 untracked 的含义)

在强制检出(git checkout -f mastermaster 时,文件被还原的原因是该文件存在于 master

如果您要执行此操作,则需要执行以下操作:

创建并检出分支

git checkout -b somebranch

somebranch中删除文件(--cached将从索引中删除文件,但会保留文件在文件系统中的完整副本。请参阅git-rm参考文档

git rm --cached somefile

提交更改。
git commit -m "Remove somefile"

这将从 Git 中删除文件,但不会从磁盘中删除,因此现在 Git 中有一个未跟踪的更改(somefile 在磁盘上但不在 Git 中)

如果您希望其他贡献者能够检出该分支,请将其链接到远程

git push --set-upstream origin somebranch

现在文件已经从origin/somebranch中删除,而不是master

当你将一个文件添加到.gitignore中时,如果它已经被提交过,那么它不会从仓库中移除。然而对于该文件的更改将被忽略(包括删除)。如果你想要真正地将该文件移除并提交更改,则需要进行相应的操作。完成后,Git将不再跟踪重新创建(或进行任何其他操作的)该文件。


不要使用 --cached。只需执行 'git rm somefile',这将从文件系统中删除该文件。当您再次检出主分支时,它应该会被恢复。 - Rik
“git rm somefile” 实际上执行的操作和 “git rm --cached somefile && rm somefile” 是相同的。因此,只会将文件从索引(缓存)中移除,而保留在文件系统中。这个操作对于 git 来说,就好像在磁盘上添加了一个文件,但并没有将其加入到 git 中。希望这能澄清一些问题。 - Rik
是的,那正是我想要的,从git中删除文件(在该分支中),但不从磁盘中删除,为什么会有问题? - Eugenio
抱歉,我还是不明白,你说“如果你从磁盘中删除而不是从git中删除”,但我做了相反的事情。 - Eugenio
抱歉,我的错误,确实是“如果你从git中删除它,而不是从磁盘中删除”。 - Rik
显示剩余13条评论

0

在切换回主分支之前,提交对我的分支所做的更改。


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