如何在本地和远程删除Git分支?

20371

尝试删除远程分支失败:

$ git branch -d remotes/origin/bugfix
error: branch 'remotes/origin/bugfix' not found.

$ git branch -d origin/bugfix
error: branch 'origin/bugfix' not found.

$ git branch -rd origin/bugfix
Deleted remote branch origin/bugfix (was 2a14ef7).

$ git push
Everything up-to-date

$ git pull
From github.com:gituser/gitproject

* [new branch] bugfix -> origin/bugfix
Already up-to-date.

我应该如何正确删除本地和远程的remotes/origin/bugfix分支?


1554
不好意思,这个问题已经有40个答案了。请问您还需要我翻译吗? - Robert Harvey
80
注意:针对 Git 2.5+(2015 年第二季度发布),准确的消息将会是“**deleted remote-tracking branch**”:请参见 https://github.com/git/git/commit/ccd593cffaa020ff767860ec211462b8dbd727a6#diff-d18f86ea14e2f1e5bff391b2e54438cbR268 - VonC
29
跳过前几个答案并直接跳到最佳答案:https://dev59.com/h3I-5IYBdhLWcg3wI0p9#23961231 。 要删除git分支,实际上有3个不同的分支需要删除! 这个答案明确了这个事实。 - Gabriel Staples
6
没有上下文,你的评论很令人困惑。这些“最佳”答案是否存在某种错误? - Nathan majicvr.com
17
@Nathan,不,他们没有错,但是“你不知道你不知道什么”是他们没有教授的内容,而我提供的链接使得这个重要的“未知未知”成为了“已知未知”,然后变成了“已知已知”。在阅读那篇回答之前,我不知道有一个本地分支、本地存储的远程跟踪分支和远程分支(1)(2)(3)。在那之前,我认为只有本地分支和远程分支。本地存储的远程跟踪分支是一个“未知未知”。让它从“未知未知”变成“已知已知”,这就是这篇回答最好的原因。 - Gabriel Staples
显示剩余5条评论
43个回答

227

另一种方法是:

git push --prune origin

警告: 这将删除所有在本地不存在的远程分支。或者更全面地说,

git push --mirror

这将有效地使远程仓库看起来像仓库的本地副本(本地主干,远程和标签都被镜像在远程)。


1
git push --prune origin 对我在GitLab上没有任何作用:git clone git://repo.git; git branch -d -r origin/some-branches; git push --prune origin; 结果:一切都是最新的;git fetch; 将本地删除的分支带回来;git push --mirror; 现在它们真的消失了! - eMBee

190

我在我的Bash设置中使用以下内容:

alias git-shoot="git push origin --delete"

那么您可以调用:

git-shoot branchname

11
我最终只是在我的.gitconfig文件中添加了"shoot"这个别名 shoot = push origin --delete - hdost
如果您的源是Atlassian Stash,并且分支设置为默认值,则会出现错误“默认情况下,禁止删除当前分支...”。在删除之前,我必须更改Stash中的默认分支以指向另一个分支。 - neoscribe
这个操作很简单,就像你已经完成的一样,但是请注意,Git 还允许您创建自定义命令。将 git push origin --delete $1 放入您的路径中的一个文件中,命名为 git-shoot,然后 git shoot branchname 也可以使用。 - mahemoff

158

本地删除:

要删除本地分支,您可以使用以下命令:

git branch -d <branch_name>
为了强制删除一个分支,请使用 -D 而不是 -d
git branch -D <branch_name>

远程删除:

有两个选项:

git push origin :branchname

git push origin --delete branchname

我建议您使用第二种方法,因为它更直观。


152

如果您想通过一个命令完成这两个步骤,可以在~/.gitconfig中添加以下内容以创建别名:

[alias]
    rmbranch = "!f(){ git branch -d ${1} && git push origin --delete ${1}; };f"

另外,您可以使用命令行将此内容添加到全局配置中。

git config --global alias.rmbranch \
'!f(){ git branch -d ${1} && git push origin --delete ${1}; };f'

注意:如果使用-d(小写的d),分支只有在被合并后才会被删除。要强制删除,需要使用-D(大写的D)。


7
这就是我想要的。我的自定义shell函数别名无法工作(出现意外的EOF错误),我也不知道为什么,但这个方法非常好用!我唯一做的更改是将 && 替换为 ;,这样即使第一个命令失败,第二个命令仍然会执行(有时只存在本地或远程存在)。 - user1021726

147
自2013年1月份以来,GitHub在“Branches”页面上每个分支旁边都包括一个Delete branch按钮。
相关博客文章:创建和删除分支

3
我今年才开始使用Github,所以我想知道为什么这个问题受到如此高的评价,而且为什么所有排名靠前的答案都没有建议直接在Github网页界面上删除它!有趣的是这只是最近增加的功能。 - Cam Jackson
6
我打算指出这一点。请注意,该按钮不会删除您的本地分支...请参考此答案了解如何操作:https://dev59.com/h3I-5IYBdhLWcg3wI0p9#10999165 - ArtOfWarfare

129

删除本地和远程分支

  • 切换到主分支 - git checkout master

  • 删除远程分支 - git push origin --delete <branch-name>

  • 删除本地分支 - git branch --delete <branch-name>


125

您也可以使用 git remote prune origin 来完成此操作。

$ git remote prune origin
Pruning origin
URL: git@example.com/yourrepo.git
 * [pruned] origin/some-branchs

它从 git branch -r 的列表中修剪和删除远程跟踪分支。


122

除了其他答案之外,我经常使用 git_remote_branch 工具。这是一个额外的安装包,但它为您提供了一种方便的方式来与远程分支交互。在这种情况下,要删除:

grb delete branch

我发现我也经常使用publishtrack命令。


116

一个 一行命令 可以删除 本地和远程:

D=branch-name; git branch -D $D; git push origin :$D

或者将以下别名添加到您的~/.gitconfig中。 用法:git kill branch-name

[alias]
    kill = "!f(){ git branch -D \"$1\";  git push origin --delete \"$1\"; };f"

22
在脚本中使用 git branch -D 命令时要小心,因为它会强制删除一个分支,而不会检查它是否已经合并。如果想安全一些,则应该使用 -d 选项。 - caesarsol

104

删除分支

假设我们在“contact-form”分支上的工作已经完成,而且我们已经将其整合到“master”中。因为我们不再需要它,所以我们可以删除它(本地):

$ git branch -d contact-form

删除远程分支的命令:

git push origin --delete contact-form

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