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


16942

我想在本地和远程删除分支。

尝试删除远程分支失败

$ 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在本地和远程删除分支,我应该采取什么不同的措施?


1054
主持人注意:如果您想回答这个问题,请注意已经发布了40个答案。您的新答案会增加任何实质性价值吗?
罗伯特·哈维

54
注意:对于Git 2.5+(2015年第二季度),确切的消息将是“ deleted remote-tracking branch”:请参见github.com/git/git/commit/…–
VonC

您可能对此脚本感兴趣,该脚本简化了删除本地分支和远程分支之间的区别:tlbx.app/blog/delete-any-git-branch-the-easy-way
Mig

@RobertHarvey现在只有39岁
亚当

@亚当:81. 42答案由于各种原因被删除。公众对特定主题的无法解释的迷恋是生活中最大的谜团之一。
罗伯特·哈维

Answers:


21417

执行摘要

$ git push -d <remote_name> <branch_name>
$ git branch -d <branch_name>

请注意,在大多数情况下,远程名称为origin。在这种情况下,您将必须像这样使用命令。

$ git push -d origin <branch_name>

删除本地分支

要删除本地分支,请使用以下任一方法:

$ git branch -d branch_name
$ git branch -D branch_name

注意:-d选项是的别名--delete,仅当分支已完全合并到其上游分支中时才删除该分支。您还可以使用-D,它是的别名--delete --force,它“删除分支”而不考虑其合并状态。[来源:man git-branch]

删除远程分支[2017年9月8日更新]

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章中:

删除远程分支

假设您已经完成了远程分支的工作-例如,您和您的协作者都完成了一项功能,并将其合并到远程主分支(或稳定代码行所在的任何分支)中。您可以使用相当钝的语法删除远程分支git push [remotename] :[branch]。如果要从服务器删除服务器修订分支,请运行以下命令:

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

繁荣。您的服务器上没有更多分支。您可能需要关注此页面,因为您将需要该命令,并且可能会忘记语法。记住此命令的一种方法是通过回顾一下git push [remotename] [localbranch]:[remotebranch]我们之前讨论过的语法。如果您忽略了那[localbranch]部分,那么您基本上就是在说:“什么都不要站在我这边做[remotebranch]。”

我发行了git push origin: bugfix,效果很好。斯科特·查孔(Scott Chacon)是对的,我想提一下该页面(或者实际上是在“堆栈溢出”中回答这个问题)。

那你应该在其他机器上执行

# Fetch changes from all remotes and locally delete 
# remote deleted branches/tags etc
# --prune will do the job :-;
git fetch --all --prune

传播变化。


353
git fetch --all --prune删除服务器上的远程分支后,不要忘记在其他计算机上执行操作。||| 在使用删除本地分支git branch -d并使用git push origin --delete其他机器删除远程分支之后,它们仍然可能具有“过时的跟踪分支”(以查看它们的用法git branch -a)。要摆脱这些事情git fetch --all --prune
Trevor Boyd Smith

14
除了使用@TrevorBoydSmith git branch -a来查看所有分支之外,您还可以git branch -r仅用于查看远程分支。另请参见git remote show origin-来源:gitready.com/intermediate/2009/02/13/list-remote-branches.html
Sandra

17
我不得不git branch -D Branch_Name逃脱了当地的分支机构
Kolob Canyon

11
@KolobCanyon如果分支尚未合并到另一个分支,则仅需使用-D。
BTRUE

3
问题是“要在本地和在GitHub上成功删除remotes / origin / bugfix分支,我需要做些什么?” 在更新后的答案中运行命令后,本地分支仍然存在。如果接受的答案是完整的答案,那就太好了。Git很难完成简单的任务,这真是太神奇了……
jww

3315

Matthew的回答对于删除远程分支非常有用,我也很欣赏其中的解释,但是要在两个命令之间进行简单区分:

要从计算机上删除本地分支

git branch -d {the_local_branch}(改用-D强制删除分支而不检查合并状态)

要从服务器删除远程分支

git push origin --delete {the_remote_branch}

参考:Git:删除分支(本地或远程)


250
@megido以及-D强制删除,-d给你一个警告,如果它不是已经合并。
TankorSmash

8
如果您的本地分支机构未与master合并并运行,'git branch -d your_branch那么您将出错,例如error: The branch 'your_branch' is not fully merged. If you are sure you want to delete it, run 'git branch -D your_branch'.
geeks 2015年

12
我建议使用-d而不是-D,因为它更安全。如果-d由于未合并的提交而失败,那么您需要进行评估,如果可以删除,则请使用-D。
rooby '16

7
其他具有已删除远程分支的存储库克隆的应用应该运行git remote prune <name>(例如git remote prune origin),以便本地删除远程中不再存在的陈旧分支。
code_dredd

3
我想补充一点,-d如果未与当前HEAD合并,则会发出警告。如果需要澄清,我建议使用此命令git branch -a --merged origin/master。它将列出本地和远程的所有分支。已经合并为主人。此处的其他信息
Eric

2039

简短的回答

如果要对以下命令进行更详细的说明,请参阅下一节的详细答案。

删除远程分支

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

可视化三个分支

使用的原始海报:

git branch -rd origin/bugfix

其中仅删除了本地远程跟踪分支 origin/bugfix,而不是实际的远程分支bugfixorigin

图2

要删除该实际的远程分支,您需要

git push origin --delete bugfix

图3

额外细节

以下各节描述了删除远程和远程跟踪分支时要考虑的其他详细信息。

推动删除远程分支也将删除远程跟踪分支

请注意,X使用a从命令行删除远程分支git push 也会删除本地远程跟踪分支 origin/X,因此不必使用git fetch --prune或修剪过时的远程跟踪分支git 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起)是简单地git fetch使用the --prune或short来运行-p请注意,这将删除远程上不再存在的任何远程分支的所有过时的本地远程跟踪分支

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

以下是1.6.6发行说明中的相关报价(重点是我的):

学习了“ git fetch” --all--multiple选项,可以从许多存储库中运行取回操作,还--prune可以选择删除过时的远程跟踪分支。 这些使“ git remote update”和“ git remote prune”的必要性降低(尽管没有计划删除“ remote update”或“ remote prune”)。

以上自动修剪的替代方法,用于过时的远程跟踪分支

另外,除了通过修剪修剪过时的本地远程跟踪分支外git fetch -p您还可以通过仅通过使用--remote-r标志手动删除分支来避免进行额外的网络操作

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

也可以看看


从您的插图中,我可以看到有本地克隆存储库和远程原始存储库。因此,至少有两个物理分支。要删除的第三个分支在哪里?第三分支只是指向本地克隆存储库中提交的指针吗?
huggie

6
@huggie几乎是正确的。Git中的分支只是附加到提交的书签。因此,在上面的图表中,本地克隆(2个分支)中有Xorigin/X书签,而X远程克隆中有(3个分支)。

6
+1为远程跟踪分支。克隆其他人的分支时,此分支会引起问题。它会继续跟踪您的提交,并询问您是否要推送到该人的分支。
Kermit_ice_tea

1
图形本身就是黄金
Mogens TrasherDK

1
为了将来的读者起见:@Kermit_ice_tea上面所说的是本地分支(如本答案所述),而不是远程跟踪分支。当本地分支为其配置了“上游分支”时,默认情况下它将从该远程分支拉出并推送到该远程分支。设置了“上游分支” 的本地分支称为“跟踪分支”,因此由于术语相似,很容易与远程跟踪分支混淆。
David P

1517

删除分支的步骤:

要删除远程分支:

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每个分支合并状态的错误引发的分支...

我还创建以下图像以显示步骤:

在git中删除远程和本地分支


48
git branch -a将显示本地和远程分支。这将为您介绍图表提供帮助。
LoranceChen

4
请注意,如果要在要删除的分支上进行设置,则在删除本地分支之前,需要签出除要删除的分支(例如主节点)以外的其他分支。
阿默尔博士

当分支机构在原始位置被删除时,您的本地存储库将不会对此进行通知。您仍将拥有这些分支的本地缓存版本(这确实不错),但是git branch -a仍会将它们列为远程分支。您可以按以下方式在本地清除该信息:这样做 git remote prune origin不会删除已删除分支的本地副本。使用git fetch --prune
vibs2006

2
图像令人分心,非常大,没有任何答案。我希望这不会成为SO的趋势。
jmiserez

796

您还可以使用以下命令删除远程分支

git push --delete origin serverfix

哪个与

git push origin :serverfix

但是可能更容易记住。


1
...而且使用更安全:O
cst1992 '17

1
您忘记了有关删除本地分支的操作​​,可以通过以下步骤来完成:git branch -d <local_branch>git branch -D <local_branch>强制删除
Amit Dash

370

提示:使用删除分支时

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


14
您应该澄清上述git push操作将删除本地分支远程分支。
Annika Backstrom

22
请注意,git remote prune删除过时的远程跟踪分支是一种过时的方法,较新的方法是使用git fetch --prunegit fetch -p

1
@RRMadhav,确实,删除后您将看不到已删除的分支,因为将为您本地删除对远程分支的引用。团队中签出该分支的其他任何人仍将具有该引用,并且仍然会看到该引用,除非他们修剪该分支。
pfrenssen 2014年

361

如果要删除分支,请先检出要删除的分支以外的分支。

git checkout other_than_branch_to_be_deleted

删除本地分支:

git branch -D branch_to_be_deleted

删除远程分支:

git push origin --delete branch_to_be_deleted

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

7
请注意,-D 强制删除。最好使用-d,它会提醒您是否需要做一些危险的事情。
Jonathon Reinhart 2015年

13
ahahah :)由您决定:如果想看到git crying,请使用-d;如果想哭,请使用-D。
费利佩2015年

224

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

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

git branch -d example

(这example是分支名称。)

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

git push origin :example

199

另一种方法是:

git push --prune origin

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

git push --mirror

将有效地使远程存储库看起来像该存储库的本地副本(本地头,远程对象和标签在远程上被镜像)。


1
git push --prune起源对gitlab没有任何帮助:git clone git://repo.git; git branch -d -r起源/分支 git push --prune起源; 收益:一切都是最新的;git fetch; 带回本地删除的分支;git push --mirror; 现在他们真的不见了!
eMBee

165

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

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

然后,您可以致电:

git-shoot branchname

11
我最终只是将别名“ shoot”添加到我的.gitconfig Shoot = push origin --delete
hdost 2014年

如果您的原点是Atlassian Stash,并且分支设置为默认分支,则会出现错误“默认情况下,删除当前分支被拒绝...”。在删除之前,我必须更改Stash中的默认分支以指向另一个分支。
新手

完成此操作非常简单,但是fyi git也可以使您自定义命令。将git push origin --delete $1文件放在您的路径中,该文件git-shootgit shoot branchname将起作用。
mahemoff

132

本地删除:

要删除本地分支,可以使用:

git branch -d <branch_name>

要强行删除分支,请使用-D代替-d

git branch -D <branch_name>

远程删除:

有两种选择:

git push origin :branchname

git push origin --delete branchname

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


129

自2013年1月起,GitHub包含了 Delete branch在“分支”页面的每个分支旁边都按钮。

相关博客文章:创建和删除分支


3
我今年才开始使用Github,所以我想知道为什么这是一个受到高度评价的问题,以及为什么没有最重要的答案建议只是从Github Web界面中删除它!有趣的是,这只是最近的补充。
Cam Jackson

6
我正要指出这一点。请注意,该按钮不会删除您的本地分支机构...有关此操作的答案,请参见以下答案:stackoverflow.com/a/10999165/901641
ArtOfWarfare 2013年

126

如果您想用一个命令完成这两个步骤,则可以通过将以下内容添加到您的别名中来为其创建别名~/.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)。


6
这就是我想要的。我自己的外壳函数别名不起作用(意外的EOF),我不知道为什么,但这很好用!我所做的唯一更改是替换为&&;因此即使第一个命令失败,第二个命令仍将执行(有时仅存在本地或仅存在远程)。
user1021726

115

在本地和远程删除分支

  • 结帐至主分支- git checkout master

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

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


112

您也可以使用 git remote prune origin

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

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


108

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

grb delete branch

我发现我也经常使用publishand track命令。


98

一个一班轮命令删除本地和远程

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"

17
⚠️ git branch -D在脚本中谨慎使用,因为它会强制删除分支而不检查其是否已合并。使用-d安全。
caesarsol

94

删除分支

假设我们在分支“联系表”上的工作已经完成,并且我们已经将其集成到“母版”中。由于我们不再需要它,因此可以将其删除(本地):

$ git branch -d contact-form

对于删除远程分支:

git push origin --delete contact-form

87

删除远程分支

git push origin :<branchname>

删除本地分支

git branch -D <branchname>

删除本地分支步骤:

  1. 结帐到另一个分支
  2. 删除本地分支

3
远程分支删除之后是否需要“ git push”?
Samitha Chathuranga

@SamithaChathuranga没有,git push origin :<branchname>已经推动一个“empty`分支到远程(因此删除远程分支)
米哈尔Szajbe

86

简单地说:

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

如果它是您自己的分支,则此方法有效。但是,如果您要修剪存储库中所有不需要的分支(其中一些不是您自己的分支),则将无法满足需求
Kermit_ice_tea

83
git push origin --delete <branch Name>

比起记忆更容易

git push origin :branchName

81

现在,您可以使用GitHub Desktop应用程序执行此操作。

启动应用程序后

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

    切换分支

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

    取消发布分支

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

    删除本地分支


15
我没有投票,但是我的想法是它没有实质性的帮助。问题显然是在不需要使用外部程序的情况下要求提供更多命令行类型的答案,如果人们单击此处,他们可能不会在桌面方式下寻找github。
Daemedeor 2015年

12
@Daemedeor,我不同意。在2010年,OP提出问题时,UI的解决方法并不存在,唯一的选择是命令行。为了表明您只希望使用命令行选项,应在问题中或使用标签command-line-interface进行说明,这种情况下不存在。
2015年

3
删除远程分支的git命令很烂,我往往会忘记它(新旧的)。幸运的是,有可以选择的GUI工具。Git Gui,TortoiseGit和GitHub Desktop都有它-我希望Git Extensions也具有此功能。无论如何,当我需要删除远程分支时,我记得是从Git Extensions中启动Git Gui。
vezenkov

78

本地删除-(正常)

git branch -d my_branch

如果您的分支机构正在进行重新基准化/合并,并且未正确完成,则表示您会收到错误消息, Rebase/Merge in progress,因此在这种情况下,您将无法删除分支。

因此,您要么需要解决重新基准化/合并。否则,您可以通过以下方式强制删除

git branch -D my_branch

远程删除:

git push --delete origin my_branch

您可以使用以下方法执行相同操作:

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

图示:

在此处输入图片说明


73

很简单:

删除远程分支

git push -d origin <branch-name>

要么

git push origin :<branch-name>

删除本地分支

git branch -D <branch-name>

2
我需要使用--delete而不是-d删除远程分支。
ZakJ

-doption是它的别名--delete,如果--deletework -d也应该起作用,如果您要删除分支,可以用-D代替-dor --delete
Vivek Maru

68

如果您具有与远程分支的名称相同的标签,则此方法将无效:

$ 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
很好,但是人们真的不应该首先使用相同的名称和命名方案来命名其分支和标记。

3
好吧,我的情况是我正在将分支转换为标签,并且标签与分支具有相同的名称是有意义的。通过转换我的意思是合并分支B到A和标记最后加上标签B犯分支B,使用删除分支B之后它仍然可以通过简单地检查了标签B.恢复
格雷格-

53

其他许多答案将导致错误/警告。这种方法是相对简单的方法,例如,git branch -D branch_to_delete如果尚未完全合并到some_other_branch,则可能仍然需要。

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

51

我讨厌用谷歌搜索这个答案,所以我对crizCraig早些时候发布的答案采取了类似的方法。

我在Bash个人资料中添加了以下内容:

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

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

gitdelete my-branch-name

...然后my-branch-nameorigin本地以及本地删除。


7
对此进行扩展,--delete "$@"-D "$@"不是$1将其用于多个分支。
kunl

3
我建议先运行git branch -d(使用小写字母“ d”)以确保更改已被合并,然后如果成功则进行推送(&&在命令之间放入)
bryn

49

执行之前

git branch --delete <branch>

通过执行以下操作,确保首先确定远程分支的确切名称是什么:

git ls-remote

这将告诉您输入什么才是正确<branch>价值。(branch区分大小写!)


46

采用:

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

如果确定要删除它,请运行

git branch -D bugfix

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

git remote prune origin
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.