从远程获取并删除分支?

623

当我运行 git fetch origin 命令时,如果 origin 仓库中的分支被删除了,我的本地仓库似乎没有更新。当我运行 git branch -r 命令时,它仍然显示 origin/DELETED_BRANCH

我应该如何解决这个问题?


4
可能是git remote branch deleted but still appears in 'branch -a'的重复问题。 - imz -- Ivan Zakharyaschev
7个回答

1138

您需要执行以下操作:

git fetch -p

-p--prune参数将会更新远程分支的本地数据库。


3
非常感谢你。之前我手动删除了那些分支。 - Maksim Dmitriev
6
由于某些原因,你的命令没有生效,但是以下这个命令可以从我的 origin 分支中删除一个不存在的远程分支:git fetch -p origin然后我执行了以下命令:git branch -r这个不存在的远程分支就不再显示出来了。 - oldfartdeveloper
15
为了完整性:它必须与 git remote prune origin 相同,并类似于 https://dev59.com/0G025IYBdhLWcg3wPzbL#6127884 和 https://dev59.com/g2Ml5IYBdhLWcg3w966L#17983126 中提到的 git pull --prune - imz -- Ivan Zakharyaschev
12
当我执行这个操作时,它显示 [deleted] (none) -> origin/ <分支名称>,但该分支仍显示在本地仓库中,你有什么想法是为什么? - Buddhi741
14
我收到一条消息说我的分支已被删除,但运行 git branch 命令仍然显示了这些被删除的分支。请帮我翻译。 - sdfsdf
显示剩余2条评论

105

来自http://www.gitguys.com/topics/adding-and-removing-remote-branches/

当有人从远程仓库中删除一个分支后,git不会自动在用户执行git pull或git fetch时删除本地仓库的分支。但是,如果用户想要将所有已在远程仓库中被删除的跟踪分支从本地仓库中删除,他们可以输入:

git remote prune origin

需要注意的是,git fetch -p中的-p参数实际上意味着“prune”。
无论你选择哪种方式,不存在的远程分支都将从你的本地仓库中删除。


我喜欢这个,因为它不会获取任何新的东西。 - Marek R
谢谢你的回答。我认为这应该是“被采纳”的答案,因为你提供了一些命令的背景信息。 - lexotero

40

您需要按照以下步骤进行操作

git fetch -p
为了同步你的分支列表。 git手册说:

-p, --prune
拉取后,删除任何在远程不存在的远程跟踪引用。如果标签只是因为默认标签自动跟随或由于--tags选项而被拉取,则不会对标签进行修剪。但是,如果标记是由于显式refspec(无论是在命令行上还是在远程配置中,例如如果使用--mirror选项克隆了远程),则它们也将受到修剪。

我个人喜欢使用git fetch origin -p --progress,因为它显示进度指示器。

23

这对我起作用了。

git remote update --prune

10

关于 git fetch -p,它的行为在 Git 1.9 中发生了改变,只有 Git 2.9.x/2.10 反映了这种变化。

参见由 Jeff King (peff)提交记录 9e70233(2016年6月13日)中撰写。
(由 Junio C Hamano -- gitster --提交记录 1c22105 (2016年7月6日)进行合并)

fetch: 记录修剪在获取之前执行

此行为在 10a6cc8 中被更改 (fetch --prune: 运行修剪操作先于获取操作, 2014-01-02),但似乎在讨论中没有人意识到我们明确地宣传了“之后”的行为。

因此,文档现在如下所述:

在获取之前,删除任何在远程不存在的远程跟踪引用。

原因是:

如果我们之前已经从远程仓库拉取了一个名为“frotz/nitfol”的跟踪分支,而远程仓库现在有了一个名为“frotz”的分支,使用“git fetch --prune”命令从远程更新代码时,“frotz/nitfol”分支将无法被删除。Git会提示用户使用“git remote prune”来解决该问题。

通过在拉取操作之前执行修剪操作,改变“fetch --prune”命令的工作方式。这样,它可以自动修复冲突,而不是向用户发出警告。


5

对于git和版本大于2.xApple git,以下方法适用:

git remote prune origin

2
如果因为某些原因(例如源存储库不再存在或无法访问)git fetch -p origin不能正常工作,另一种解决方法是从存储库的根目录执行以下操作,以删除在该分支上本地存储的信息:
rm .git/refs/remotes/origin/DELETED_BRANCH

如果存储在文件.git/packed-refs中,则可以通过删除相应的行来删除引用,该行类似于:

7a9930974b02a3b31cb2ebd17df6667514962685 refs/remotes/origin/DELETED_BRANCH

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