有很多类似的问题(eidogg. this one或this one),但公认的答案似乎没有回答我的确切问题。
Branch 1未合并到主服务器。计算机A和计算机B都指向同一个远程服务器。Branch 1存在于该远程服务器上。
在机器A上,我在本地删除Branch 1,然后将删除推送到远程,这样Branch 1和remotes/origin/Branch 1就从机器A中删除,Branch 1也从远程中删除。
在机器B上运行
git checkout Branch1
然后git checkout Branch2
然后git fetch --prune
git fetch --prune
从计算机B上的本地存储库中删除remotes/origin/Branch 1。如果我随后通过运行git checkout Branch1
返回Branch 1,则会收到错误消息
已切换到分支“Branch 1”
您的分支基于“origin/Branch 1”,但上游没有了。
(use“git分支--未设置-上游”到修复)
有没有git命令可以移除上游已删除的本地分支?
4条答案
按热度按时间krcsximq1#
没有内置的方法可以做到这一点,但是使用以下代码 * 是 * 可能的:
此命令由以下几部分组成:
git fetch -p
:确保远程分支是最新的git for-each-ref --format '%(refname:short) %(upstream:track)'
:这将以我们选择的格式返回git分支,其中我们既有本地分支名称,也有上游分支名称(对于删除了远程分支的分支,将为“[gone]”)awk '$2 == \"[gone]\" {print $1}'
:过滤远程状态为“[gone]”的分支,返回本地分支名称xargs -r git branch -D
删除本地分支您甚至可以通过运行以下命令将上面的命令添加为git别名:
一旦这个命令完成,你可以执行
git gone
,它将删除本地分支,远程分支已经被删除。您可以在this blog post中阅读完整说明
4ioopgfo2#
Whymarrh的评论是正确的:没有内置的命令来执行此操作。
也有一个很好的理由不存在这样的内置机制,仅仅因为上游的远程跟踪分支已经被删除并不意味着你一定要放弃你自己的工作,在你的例子中,也许在
git fetch --prune
删除origin/Branch1
之前,提交图看起来像这样:你在
Branch1
上做了一个很好的提交,并准备进行git push
,但上周被中断了。现在origin/Branch1
已经没有了,也许你想把那个好的提交复制到其他地方。但是现在origin/Branch1
已经没有了,没有理由在图中保留这个扭结,Git能看到的就是:它知道您的
Branch1
有一个配置的上游,但不知道配置的上游指向哪个提交,回到它存在的时候。尽管如此,如果您非常确定要删除这样的分支,您可以通过一个简短的脚本来完成:
(the以上未经测试;它也不会删除 current 分支,因为你不能删除,所以你需要确定你在一个你不打算删除的分支上)。
uemypmqf3#
git remote prune origin --dry-run
删除
--dry-run
以实际执行修剪。从docs:删除
name
下的所有过时的远程跟踪分支。这些过时的分支已从name
引用的远程存储库中删除,但在“remotes/name
“中仍然本地可用。iaqfqrcu4#
这个命令已经为我删除了在上游被删除的'foo'分支。
你必须在当地的主要分支,否则你会得到这个:
error: Cannot delete branch 'foo' checked out at...