Git从分支删除文件,将其保留在主目录中

Eug*_*nio 6 git

我创建一个新分支

git checkout -b mybranch
Run Code Online (Sandbox Code Playgroud)

然后我从中删除文件

git rm --cached myfile.txt
Run Code Online (Sandbox Code Playgroud)

但我想保留在主人那里;为什么当我结账给主人

git checkout master
Run Code Online (Sandbox Code Playgroud)

我收到“错误:以下未跟踪的工作树文件将被checkout覆盖:file.txt”,并且如果我强制执行checkout

git checkout master -f
Run Code Online (Sandbox Code Playgroud)

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

我确定我丢失了一些东西,但是我只是想从分支而不是从master删除文件,而当我结账master时git似乎想合并分支。

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

Rik*_*Rik 6

git 会将该文件视为未跟踪,因为它尚未提交。您必须在切换分支之前提交更改。

因此,您创建了一个分支并对该分支进行了更改。当你尝试切换回mastergit 时将不允许这样做,因为还有尚未提交的更改(或明确忽略;(这实际上就是这个意思untracked

git checkout -f master当您强制检出 ( ) 时文件被恢复的原因master是因为该文件位于master

如果您想这样做,您将必须执行以下操作

创建并签出分支

git checkout -b somebranch
Run Code Online (Sandbox Code Playgroud)

从中删除文件somebranch--cached实际上会从索引中删除文件,但会在文件系统上完整保留文件。请参阅git-rm 参考文档

git rm --cached somefile
Run Code Online (Sandbox Code Playgroud)

提交更改

git commit -m "Remove somefile"
Run Code Online (Sandbox Code Playgroud)

这将从 git 中删除文件,但不会从磁盘中删除,所以现在到 git 中,您有一个未跟踪的更改(某些文件在磁盘上,但不在 git 中)

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

git push --set-upstream origin somebranch
Run Code Online (Sandbox Code Playgroud)

现在该文件已被删除,origin/somebranch并且没有master

当您添加文件时,.gitignore如果文件已经提交,则不会从存储库中删除该文件。然而,对文件的更改将被忽略(因此也将删除它)。如果您这样做,您仍然需要删除该文件并提交。之后,当重新创建文件(或对文件执行任何其他操作)时,git 将不再跟踪该文件。


Jef*_*ett 6

如果您想继续跟踪master上的myfile.txt但已从mybranch中删除,则只需要删除它并提交删除即可。

git checkout -b mybranch
rm myfile.txt
git commit -am "delete myfile.txt"
Run Code Online (Sandbox Code Playgroud)

现在,当您结帐母版时,您会看到文件已退回,而当您结帐mybranch时,它将再次消失。

注意:如果将mybranch合并到master中,则也会在master上将其删除。

  • 谢谢,它有效,但我需要在提交之前添加“git add -u”或使用“git rm”而不是 rm。如果您编辑答案,我会接受它。 (2认同)
  • 我不敢相信这个 ans 得到了 8 票...我认为问题是...是否有一种方法可以将文件限制为 master 而不是其他分支...例如秘密信息可以保存在属性文件中在 master 分支中,并且 master 分支只能由管理员访问 (2认同)