如何在本地和远程删除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个回答

97

删除本地文件 - (普通)

git branch -d my_branch

如果你的分支正在进行rebase/merge操作,并且操作不正确,那么你将会收到错误提示:Rebase/Merge in progress,在这种情况下,你将无法删除你的分支。

因此,你需要先解决rebase/merge操作。否则,你可以使用强制删除命令delete

git branch -D my_branch

删除远程文件:

git push --delete origin my_branch

你可以使用相同的方法:

git push origin :my_branch   # Easy to remember both will do the same.

图形表示:

在此输入图片描述


95

删除远程分支

git push origin :<branchname>

删除本地分支

git branch -D <branchname>

删除本地分支步骤:

  1. 切换到其他分支
  2. 删除本地分支

3
删除远程分支后是否需要执行 "git push" 命令? - Samitha Chathuranga
1
@SamithaChathuranga 不是的,git push origin :<branchname> 已经将一个“空”分支推送到远程(因此删除了远程分支)。 - Michał Szajbe

94

简单说:

git branch -d <branch-name>
git push origin :<branch-name>

这个方法只适用于你自己的分支。但是如果你要修剪存储库中所有不需要的分支(其中一些不是你自己的),这个方法就不够了。 - Kermit_ice_tea

92

现在,您可以使用GitHub Desktop应用程序来完成这项任务。

启动应用程序后:

  1. 单击包含要删除分支的项目。
  2. 切换到您想要删除的分支。

    Switching branch

  3. 从“分支”菜单中选择“取消发布...”,以便将该分支从GitHub服务器上删除。

    Unpublish branch

  4. 从“分支”菜单中选择“删除“branch_name”...”,以使该分支从您的本地计算机(也称为您当前正在使用的计算机)中删除。

    Delete local branch


15
我没有给这篇文章点踩,但我的想法是它并没有实质性的帮助。显然,这个问题要求提供更多命令行类型的答案,而不需要使用外部程序。如果人们进入这里,他们可能不会寻找 GitHub 桌面版的解决方案。 - Daemedeor
12
@Daemedeor,我不同意。当2010年问题的提问者提出问题时,UI方式还不存在,唯一的选择是使用命令行。若要表明只需要命令行选项,则应在问题中或标签中注明 [tag:command-line-interface],而在这种情况下并未注明。 - Eric
3
删除远程分支的 Git 命令很烦人,我经常忘记它(无论是新的还是旧的)。幸运的是有图形界面工具提供此选项。Git Gui、TortoiseGit 和 GitHub Desktop 都有此功能 - 我希望 Git Extensions 也有。不管怎样,我记得需要删除远程分支时从 Git Extensions 中启动 Git Gui。 - vezenkov

90
git push origin --delete <branch Name>

比...更容易记住

git push origin :branchName

82

如果您在远程分支上有与标签名称相同的标签,则此方法将无法正常工作:

$ git push origin :branch-or-tag-name
error: dst refspec branch-or-tag-name matches more than one.
error: failed to push some refs to 'git@github.com:SomeName/some-repo.git'
在这种情况下,您需要明确指定您想要删除的是分支,而不是标签:

在这种情况下,您需要明确指定您想要删除的是分支,而不是标签:

git push origin :refs/heads/branch-or-tag-name

同样,如果要删除标签而不是分支,您可以使用以下命令:

git push origin :refs/tags/branch-or-tag-name

1
这没问题,但是人们在第一时间就不应该使用相同的名称和相同的命名方案来命名他们的分支和标签。 - user456814
3
我的情境是将一个分支转换为标签,标签的名称与分支相同是有意义的。所谓转换是指将分支B合并到A,并对分支B中的最后一次提交打上B标签,这样在删除分支B后,只需检出标签B即可轻松恢复它。 - Greg
关于 : 的更多信息,以及为什么它会 删除,请参见此处 - Timo
当我执行 git push origin :refs/heads/main 时,仍然会出现相同的错误 error: failed to push some refs to 'https://github.com/tik9/tik9.github.io'。很可能是 github 的问题。 - Timo
它不会删除远程分支,我收到了“remote: ! Push rejected, cannot delete main branch”的错误提示。 - Timo

63

许多其他答案将导致错误/警告。 尽管您仍可能需要git branch -D branch_to_delete(例如),但此方法相对而言是相对容易的。

git checkout some_other_branch
git push origin :branch_to_delete
git branch -d branch_to_delete

如果您已删除远程分支,则无需进行远程修剪。它仅用于获取您正在跟踪的存储库中最新的可用远程内容。我注意到 git fetch 会添加远程内容,而不是删除它们。这是一个 git remote prune origin 将实际执行操作的示例:

用户A执行上述步骤。用户B将运行以下命令以查看最新的远程分支:

git fetch
git remote prune origin
git branch -r

63

根据最新的文件,我们可以使用终端以以下方式删除。

本地删除:

git branch -D usermanagement

远程删除:

git push --delete origin usermanagement

4
我真的不明白为什么git命令如此不一致和难以记忆。看看删除操作,一个是-D,另一个是-d|--delete - Honghao Z
在 Git 版本 2.25.1 中,git branch 命令也有 -d, --delete 选项。-D--delete --force 的快捷方式。 - lylhw13

60

我厌倦了为这个问题在谷歌上搜索,所以我采用了类似于crizCraig之前发布的答案的方法。

我将以下内容添加到我的Bash配置文件中:

function gitdelete(){
    git push origin --delete $1
    git branch -D $1
}

然后每次我完成一个分支(例如合并到master),我都会在终端中运行以下命令:

然后每次我完成一个分支(例如合并到master),我都会在终端中运行以下命令:

gitdelete my-branch-name

...然后从origin和本地删除my-branch-name


7
扩展一下,使用--delete "$@"-D "$@"代替$1可以处理多个分支。 - kunl
6
建议先运行 git branch -d 命令(小写字母 'd'),确保更改已经合并,如果成功后再进行推送(在命令之间加入 &&)。 - bryn

58

使用:

git push origin :bugfix  # Deletes remote branch
git branch -d bugfix     # Must delete local branch manually

如果您确定想要删除它,请执行

git branch -D bugfix

现在要清理已删除的远程分支,请运行

git remote prune origin

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