如何从自动完成功能中删除已删除的分支名称?


120

我曾经git branch -d myBranch删除过一个分支。但是,当我在master上并尝试用签出新分支时git checkoutmyBranch仍会在tab-autocomplete中显示。

如何myBranch从选项卡自动完成中删除名称git checkout


10
是否git branch -a仍然名单要么myBranch还是origin/myBranch?请注意,即使myBranch不存在,git checkout myBranch仍然是git checkout -b myBranch origin/myBranchif 的有效快捷方式origin/myBranch
twalberg

2
@twalberg值得发布作为答案。
cmbuckley

Answers:


81

造成这种情况的一个可能原因是,如果origin/myBranch仍然存在一个远程分支(例如),则将git checkout myBranch替代git checkout -b myBranch origin/myBranch。这是为了方便第一次签出远程分支的普通情况下的方便,从而创建了一个同名的本地跟踪分支。

还有其他可能性,具体取决于您要使用什么来完成任务,但这是我要检查的第一件事。如果您运行git branch -a,并且origin/myBranch列出了一个列表(origin如果不是,则列出了一个远程列表,如果不是这样的话),那么这可能是元凶。


2
谢谢!这似乎是罪魁祸首。origin/myBranch仍然存在。如果我myBranch(通过在线界面)删除了Github上的分支,我可以安全地调用git branch -d origin/myBranch以删除该远程分支吗?
约翰·霍夫曼

99
@JohnHoffman应该是安全的,但是我认为更好的方法是git fetch --prune origin。这将清除远程上不再存在的所有本地跟踪分支。
twalberg

3
@twalberg我不认为简单地删除本地和远程分支就足以摆脱自动完成中的所有旧分支。我相信你必须git fetch --prune origin为在远程分支机构的本地引用消失在自动完成。将其从评论移至答案可能会很好。无论如何,感谢您的回复,它对我有所帮助!
timmyl,2015年

4
git branch -a带我走了正确的路;我的同事建议git fetch --prune --all修剪所有远程控制器上所有死掉的分支,这在与许多使用大量fork的开发人员一起工作时非常有用。
ericsoco

173

git fetch --prune --all

由于这是单行修复,因此将其发布为自己的答案,但是如果您投票,请务必投票给@twalberg上面的答案。

@twalberg的建议git branch -a使我走上了正轨;我的同事建议git fetch --prune --all修剪所有远程控制器上所有死掉的分支,这在与许多使用大量fork的开发人员一起工作时非常有用。


19
尽管已接受的答案很好地解释了为什么会发生这种情况,但该答案提供了解决该问题的实际方法,因此应接受恕我直言。
Patrick Oscity

3
死枝名称仍显示在自动完成中。
Fitsyu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.