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

25637

执行摘要

git push -d <remote_name> <branchname>
git branch -d <branchname>

注意:在大多数情况下,<remote_name>将是origin

删除本地分支

要删除本地分支,请使用以下之一:

git branch -d <branch_name>
git branch -D <branch_name>
  • -d选项是--delete的别名,只有在分支已经完全合并到上游分支时才会删除该分支。
  • -D选项是--delete --force的别名,无论分支是否已合并,都会删除该分支。[来源:man git-branch]
  • Git v2.3开始,git branch -d(删除)学会了遵守-f(强制)标志。
  • 如果尝试删除当前选择的分支,将收到错误提示。

删除远程分支

Git v1.7.0开始,您可以使用以下命令删除远程分支:

$ git push <remote_name> --delete <branch_name>

可能比这个更容易记住
$ git push <remote_name> :<branch_name>

这是在Git v1.5.0中添加的功能,用于删除远程分支或标签。

Git v2.8.0开始,你还可以使用git push命令的-d选项作为--delete的别名。因此,你安装的Git版本将决定你需要使用更简单还是更复杂的语法。

删除远程分支[来自2010年1月5日的原始答案]

来自Scott Chacon的《Pro Git》第3章:

Deleting Remote Branches

Suppose you’re done with a remote branch — say, you and your collaborators are finished with a feature and have merged it into your remote’s main branch (or whatever branch your stable code-line is in). You can delete a remote branch using the rather obtuse syntax git push [remotename] :[branch]. If you want to delete your serverfix branch from the server, you run the following:

$ git push origin :serverfix
To git@github.com:schacon/simplegit.git
 - [deleted]         serverfix

Boom. No more branches on your server. You may want to dog-ear this page, because you’ll need that command, and you’ll likely forget the syntax. A way to remember this command is by recalling the git push [remotename] [localbranch]:[remotebranch] syntax that we went over a bit earlier. If you leave off the [localbranch] portion, then you’re basically saying, “Take nothing on my side and make it be [remotebranch].”

我运行了git push origin :bugfix,结果非常顺利。Scott Chacon说得对——我会想要把这页角折起来(或者通过在Stack Overflow上回答问题来实现虚拟的角折叠)。
最后,在其他机器上执行以下操作以传播更改:
# Fetch changes from all remotes and locally delete 
# remote deleted branches/tags etc
# --prune will do the job :-;
git fetch --all --prune

550
在服务器上删除远程分支后,在其他机器上执行git fetch --all --prune,以确保同步最新的仓库状态。使用git branch -d删除本地分支并使用git push origin --delete删除远程分支后,其他机器可能仍然存在"过时的跟踪分支"(可通过git branch -a查看)。要解决这个问题,请使用git fetch --all --prune命令。 - Trevor Boyd Smith
29
除了 @TrevorBoydSmith 提供的 git branch -a 命令可以查看所有分支外,你也可以使用 git branch -r 命令来只查看远程分支。另外还可以参考 git remote show origin 命令。查看更多信息请访问来源网站:http://gitready.com/intermediate/2009/02/13/list-remote-branches.html - Sandra
32
为了删除本地分支,我必须运行git branch -D 分支名称 - Kellen Stuart
22
如果分支没有合并到其他分支中,你只需要使用 -D。 - BTRUE
9
问题是:“我需要做什么不同的事情才能成功地删除本地和GitHub上的远程/origin/bugfix分支?” 在运行您更新的答案中的命令后,本地分支仍然存在。如果被接受的答案是一个完整的答案,那就太好了。Git让简单的任务变得如此困难,这真是太不可思议了... - jww
显示剩余23条评论

3738

Matthew的回答非常适用于删除远程分支,我也很感谢其中的解释。但是为了简单区分这两个命令:

  • 从您的计算机中删除一个本地分支: git branch -d {local_branch}(使用-D强制删除分支而不检查合并状态);

  • 从服务器中删除一个远程分支: git push origin -d {remote_branch}.

参考资料: Git: 删除一个分支(本地或远程).


281
@megido 好的,-D 强制删除,-d 如果尚未合并则会提醒你。 - TankorSmash
12
如果你的本地分支没有与主分支合并,并且执行了'git branch -d your_branch',则会出现错误信息:error: The branch 'your_branch' is not fully merged. 如果确定要删除它,请运行'git branch -D your_branch'。 - Neelabh Singh
19
我建议使用-d代替-D,因为它更安全。如果由于未合并的提交而导致-d失败,则需要对此进行评估,如果确定可以删除,则使用-D。 - rooby
11
已删除远程分支的代码库克隆副本的用户应运行git remote prune <名字>(例如:git remote prune origin),以便在本地移除那些在远程不再存在的陈旧分支。请注意不改变原意,使翻译内容更通俗易懂。 - code_dredd
5
我想补充一点:如果-d选项没有与当前的HEAD合并,它会发出警告。 如果您需要澄清,我建议您使用以下命令:git branch -a --merged origin/master 它将列出任何已合并到master的本地和远程分支。这里有附加信息 - Eric
显示剩余4条评论

2634

简短回答

如果您想要更详细的以下命令解释,请查看下一节中的长回答。

删除远程分支

git push origin --delete <branch>  # Git version 1.7.0 or newer
git push origin -d <branch>        # Shorter version (Git 1.7.0 or newer)
git push origin :<branch>          # Git versions older than 1.7.0

刪除本地分支

git branch --delete <branch>
git branch -d <branch> # Shorter version
git branch -D <branch> # Force-delete un-merged branches

删除本地远程跟踪分支

git branch --delete --remotes <remote>/<branch>
git branch -dr <remote>/<branch> # Shorter

git fetch <remote> --prune # Delete multiple obsolete remote-tracking branches
git fetch <remote> -p      # Shorter

长答案:

删除分支时,有三个不同的分支需要处理!

当你要删除本地和远程分支时,请记住涉及到三个不同的分支

  1. 本地分支 X
  2. 远程源分支 X
  3. 本地跟踪远程分支 origin/X,用于跟踪远程分支 X

Visualization of three branches

原帖作者使用了:

git branch -rd origin/bugfix

他仅删除了本地的远程追踪分支 origin/bugfix,而没有删除实际的远程分支 origin 上的 bugfix 分支。

Diagram 2

要删除远程分支,你需要

git push origin --delete bugfix

Diagram 3

附加细节

以下部分描述了在删除远程和远程跟踪分支时需要考虑的其他细节。

推送以删除远程分支也会删除远程跟踪分支

请注意,使用git push命令行从远程分支X中删除也将删除本地远程跟踪分支origin/X,因此不必使用git fetch --prunegit fetch -p修剪过时的远程跟踪分支。但是,如果您这样做,也不会有任何损失。

您可以通过运行以下命令来验证已删除远程跟踪分支origin/X

# View just remote-tracking branches
git branch --remotes
git branch -r

# View both strictly local as well as remote-tracking branches
git branch --all
git branch -a

修剪过时的本地远程跟踪分支 origin/X

如果您没有像上面那样从命令行删除远程分支 X,则您的本地存储库仍将包含(现在已过时的)远程跟踪分支 origin/X。例如,如果您直接通过 GitHub 的 Web 接口删除了远程分支,则可能会发生这种情况。

自 Git 版本 1.6.6 以来,删除这些过时的远程跟踪分支的典型方法是简单地使用 --prune 或更短的 -p 运行 git fetch请注意,这将删除所有不再存在于远程的远程分支的过时本地远程跟踪分支

git fetch origin --prune
git fetch origin -p # Shorter

以下是来自1.6.6版本发布说明的相关引用(重点在于我):

"git fetch" 学会了 --all--multiple 选项,可以从多个仓库运行fetch,并使用--prune选项删除已过期的远程跟踪分支。 这使得 "git remote update" 和 "git remote prune" 不再必要(尽管没有计划删除 "remote update" 或 "remote prune")。

清除过时的远程跟踪分支的替代方法

或者,您可以通过使用 --remotes-r 标志手动删除分支,而不是通过 git fetch -p 清除过时的本地远程跟踪分支,这样可以避免进行额外的网络操作

git branch --delete --remotes origin/X
git branch -dr origin/X # Shorter

参见


9
@huggie 的理解基本正确。Git 中的分支只是附加到提交记录上的书签。因此,在我的上图中,本地克隆有 Xorigin/X 两个书签(2 个分支),然后在远程有一个名为 X 的书签(总共 3 个分支)。 - user456814
14
对于远程跟踪分支+1。这个分支是在克隆别人的分支时会出现问题的原因。它不断地跟踪您的提交,并询问您是否要推送到那个人的分支。 - Kermit_ice_tea
4
为了方便未来的读者:@Kermit_ice_tea 上面所说的是一个“本地分支”(如这个答案所述),而不是“远程跟踪分支”。当为“本地分支”配置了“上游分支”时,默认情况下,它将从该远程分支拉取并推送。一个有“上游分支”设置的“本地分支”被称为“跟踪分支”,因为术语类似,很容易与“远程跟踪分支”混淆。 - David P
7
我已经阅读了所有回答,这肯定是我到目前为止读过的最好的答案!(可能也是整个页面上最好的答案)。尤其是因为这是唯一一个强调了这个非常重要的事实的答案,我以前从未知道:“有三个不同的分支可以删除!” 我毫不知情!现在这一切都更加有意义了,同时也让其他的回答变得更加清晰易懂。谢谢! - Gabriel Staples
7
需要注意的是,根据我所知,运行 git push origin --delete <branch> 不仅会删除远程分支,还将删除名为 origin/branch 的本地存储的远程跟踪分支。因此,要一次性删除远程分支和本地存储的远程跟踪分支,只需使用 git push origin --delete <branch> 命令即可。 然后,您只需要使用 git branch -D branch 命令删除本地分支。使用这两个命令就可以删除所有3个分支。 - Gabriel Staples
显示剩余3条评论

1714

删除分支的步骤:

删除远程分支:

git push origin --delete <your_branch>

删除本地分支,您有三种方法

1: git branch -D <branch_name>

2: git branch --delete --force <branch_name>  # Same as -D

3: git branch --delete  <branch_name>         # Error on unmerge

解释: 好的,就解释一下这里正在发生什么!

只需执行git push origin --delete仅删除你的远程分支 ,在最后添加分支名称,它将同时删除并将其推送到远程...

此外,git branch -D仅删除本地分支 !...

-D代表--delete --force,即使未合并(强制删除),但你也可以使用-d,它代表--delete会根据分支合并状态抛出错误...

我还创建了下面的图片来展示步骤:

Delete a remote and local branch in git


61
git branch -a命令会显示本地和远程分支,这对于你的图表介绍会有帮助。 - LoranceChen
6
请注意,如果您正在所要删除的分支上进行操作,请在删除本地分支之前切换到其他分支(例如:主分支)以避免错误。请确保翻译后内容的意思与原文相同,并且尽可能通俗易懂。 - BaDr Amer
当分支在源上被删除时,您的本地存储库不会注意到。您仍将拥有这些分支的本地缓存版本(实际上很好),但是git branch -a仍将列出它们作为远程分支。您可以通过以下方式在本地清除此信息:git remote prune origin 这样做不会删除已删除分支的本地副本。使用以下命令也可以达到同样的效果: git fetch --prune - vibs2006
16
这张图片太大了,而且对答案没有任何帮助,反而让人分心。我希望这不会成为stackoverflow上的趋势。 - jmiserez
只是为了记录相反的观点。我发现这个图像非常有帮助。 - user2171796

913

你也可以使用以下方法来删除远程分支

git push --delete origin serverfix

与其执行相同的操作是什么?

git push origin :serverfix

但是可能更容易记住。


2
更安全易用 :O - cst1992
2
你忘记了删除本地分支的部分,可以通过以下命令实现:git branch -d <local_branch> 或者使用 git branch -D <local_branch> 强制删除。 - Amit Dash

598

非常简单:

要删除远程分支

git push -d origin <branch-name>

或者

git push origin :<branch-name>

-- 您也可以使用这种语法删除标签

强制删除本地分支的方法:

git branch -D <branch-name>

注意: 在删除远程分支后,在其他机器上执行git fetch --all --prune以删除过时的跟踪分支。

示例

要删除本地分支

git branch -D my-local-branch

删除远程分支的命令

git push origin :my-remote-branch

使用新版本的Git,也可以通过以下方式删除分支:

git push origin --delete <branch_name>

提示: 如果您想查看所有可用的分支,可以使用git branch -a, 而要仅查看远程分支,则可以使用git branch -r


11
我需要使用--delete而不是-d来删除远程分支。 - ZakJ
3
-d选项是--delete的别名,如果--delete起作用,则-d也应该起作用。如果您强制删除分支,则可以使用-D而不是-d--delete - Vivek Maru
-d 对我不起作用。终端告诉我要使用 -D - C-Dev

414

提示:当你使用

git branch -D <branch_name>

命令删除分支时,分支上尚未合并的更改将会被永久删除。如果你想保留这些更改,请先将它们合并到其他分支中。

git branch -d <branchname> # Deletes local branch
或者
git push origin :<branchname> # Deletes remote branch

仅删除引用。即使分支在远程实际上被删除,对它的引用仍然存在于团队成员的本地代码库中。这意味着对于其他团队成员,在执行git branch -a命令时,已删除的分支仍然可见。

为了解决这个问题,您的团队成员可以使用以下命令清理已删除的分支:

git remote prune <repository>

这通常是git remote prune origin


15
你应该澄清一下上述的 git push 操作会删除本地分支 远程分支。 - Annika Backstrom
23
注意,git remote prune 是删除过时的远程跟踪分支的一种相对而言已经过时的方法,更新的方法是使用 git fetch --prunegit fetch -p - user456814
1
@RRMadhav,确实在删除分支后,您将无法看到已删除的分支,因为远程分支的引用将在本地被删除。您团队中的其他成员如果检出了该分支,则仍将保留该引用,并且除非他们修剪该分支,否则仍将看到它。 - pfrenssen

393

如果您想删除一个分支,首先切换到要删除的分支之外的分支。

git checkout other_than_branch_to_be_deleted

删除本地分支:

git branch -D branch_to_be_deleted

删除远程分支:

git push origin --delete branch_to_be_deleted

这个答案应该被选择,因为它包含了大多数答案中遗漏的重要信息,即要删除分支,你必须处于其他分支而不是要删除的分支。当我在同一个分支上时,我一直收到错误提示。 - Afamee

290
git branch -D <name-of-branch>
git branch -D -r origin/<name-of-branch>
git push origin :<name-of-branch>

8
请注意,-D 是强制删除。最好使用 -d,这将提醒您是否需要执行危险操作。 - Jonathon Reinhart
14
哈哈哈 :) 由你决定:如果想看Git哭泣,请使用-d;如果想自己哭泣,请使用-D。 - Felipe

250

很简单:只需运行以下命令:

要同时删除本地和远程的Git分支,请首先使用以下命令删除本地分支:

git branch -d example

(这里example是分支名称。)

之后,使用以下命令删除远程分支:

git push origin :example

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