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

时间:2010-01-05 01:12:16

标签: git git-branch git-remote

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

尝试删除远程分支失败:

$ 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本地和远程分支?

41 个答案:

答案 0 :(得分:19057)

执行摘要

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

请注意,在大多数情况下,远程名称为origin

删除本地分支

要删除本地分支,请使用以下某个选项:

$ 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是对的 - 我想要dog ear那个页面(或者通过在Stack Overflow上回答这个问题,实际上是狗耳朵)。

然后你应该在其他机器上执行它

git fetch --all --prune

传播变化。

答案 1 :(得分:3029)

Matthew的答案很适合删除远程分支,我也很欣赏这些解释,但要简单区分这两个命令:

从您的计算机中删除 本地分支

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

从服务器中删除 远程分支

git push origin --delete {the_remote_branch}

参考:https://makandracards.com/makandra/621-git-delete-a-branch-local-or-remote

答案 2 :(得分:1752)

简短答案

如果您想要更详细地解释以下命令,请参阅下一节中的长答案。

删除远程分支:

git push origin --delete <branch>  # Git version 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 tracking branches
git fetch <remote> -p      # Shorter

长答案:有3个不同的分支要删除!

当您在本地和远程处理删除分支时,请记住涉及3个不同的分支

  1. 本地分支X
  2. 远程原始分支X
  3. 跟踪远程分支origin/X的本地远程跟踪分支X
  4. Visualization of 3 branches

    使用原始海报

    git branch -rd origin/bugfix
    

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

    Diagram 2

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

    git push origin --delete bugfix
    

    Diagram 3

    其他详细信息

    以下部分介绍了删除远程和远程跟踪分支时需要考虑的其他详细信息。

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

    请注意,使用X 从命令行删除远程分支git push也会删除本地远程跟踪分支 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开始)的典型方法是使用git fetch或更短的--prune运行-p请注意,这将删除远程不再存在的任何远程分支的所有过时的本地远程跟踪分支

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

    以下是1.6.6 release notes(强调我的)的相关引用:

      

    &#34; git fetch&#34;了解了 --all--multiple选项,以便从中运行获取   许多存储库和 --prune选项可删除远程跟踪   过时的分支。这些使得&#34; git远程更新&#34;和&#34; git   远程修剪&#34;不太必要(没有计划删除&#34;远程   更新&#34;也不是&#34;远程修剪&#34;,但是)。

    替代上述过时远程跟踪分支的自动修剪

    或者,不是通过git fetch -p修剪过时的本地远程跟踪分支,而是通过仅使用{{{p}手动删除分支来避免进行额外的网络操作。 1}}或--remote标志:

    -r

    另见

答案 3 :(得分:1268)

删除分支的步骤:

删除远程分支:

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 仅删除远程分支,在末尾添加分支的名称,这将删除并同时将其推送到远程... < / p>

另外,git branch -D,只删除本地分支!...

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

我还创建了下面的图片以显示步骤:

delete a remote and local branch in git

答案 4 :(得分:751)

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

git push --delete origin serverfix

相同
git push origin :serverfix

但可能更容易记住。

答案 5 :(得分:358)

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

git checkout other_than_branch_to_be_deleted

删除本地分支:

git branch -D branch_to_be_deleted

删除远程分支:

git push origin --delete branch_to_be_deleted

答案 6 :(得分:354)

提示:使用

删除分支时
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

答案 7 :(得分:257)

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

答案 8 :(得分:221)

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

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

git branch -d example

(此处example是分支名称)

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

git push origin :example

答案 9 :(得分:191)

另一种方法是: -

git push --prune origin

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

git push --mirror

将有效地使远程存储库看起来像存储库的本地副本(本地磁头,远程控制器和标签在远程上镜像)。

答案 10 :(得分:161)

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

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

然后你可以打电话:

git-shoot branchname

答案 11 :(得分:128)

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

相关博文:Create and delete branches

答案 12 :(得分:120)

如果您想通过一个命令完成这两个步骤,可以通过在~/.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)。

答案 13 :(得分:119)

在本地删除:

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

git branch -d <branch_name> 

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

git branch -D <branch_name>

远程删除:

有两种选择:

git push origin :branchname  

git push origin --delete branchname 

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

答案 14 :(得分:112)

在本地和远程删除分支

  • 结帐至主分行 - onmouseover="jQuery(this).css('background-image','url('<?php echo $ur;?>')');"

  • 删除远程分支 - git checkout master

  • 删除您的本地分支 - git push origin --delete <branch-name>

答案 15 :(得分:107)

您也可以使用git remote prune origin

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

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

答案 16 :(得分:104)

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

grb delete branch

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

答案 17 :(得分:93)

单行命令删除本地和远程

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"

答案 18 :(得分:91)

Deleting Branches

  

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

$ git branch -d contact-form

删除远程分支:

git push origin --delete contact-form

答案 19 :(得分:86)

删除远程分支

git push origin :<branchname>

删除本地分支

git branch -D <branchname>

删除本地分支步骤:

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

答案 20 :(得分:85)

简单地说:

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

答案 21 :(得分:79)

现在,您可以使用GitHub Desktop应用

进行此操作

启动应用后

  1. 单击包含分支的项目
  2. 切换到要删除的分支switching branch
  3. 从“分支”菜单中选择“取消发布...”,以从GitHub服务器中删除分支。 unpublish branch
  4. 从“分支”菜单中选择“删除” branch_name “...”,将分支从本地计算机(即您当前正在处理的计算机)中删除{ {3}}

答案 22 :(得分:78)

git push origin --delete <branch Name>

更容易记住
git push origin :branchName

答案 23 :(得分:73)

要在本地删除 - (正常),

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.

图形表示,

enter image description here

答案 24 :(得分:64)

如果您的标签与遥控器上的分支同名,则无法使用

$ 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

答案 25 :(得分:51)

许多其他答案都会导致错误/警告。这种方法相对简单,但如果它未完全合并到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

答案 26 :(得分:49)

我厌倦了谷歌搜索这个答案,所以我采取了类似的方法 到the answer that crizCraig posted之前。

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

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

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

gitdelete my-branch-name

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

答案 27 :(得分:45)

执行前

git branch --delete <branch>

确保首先通过执行确定远程分支的确切名称:

git ls-remote

这将告诉您输入<branch>值的确切内容。 (branch区分大小写!)

答案 28 :(得分:44)

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

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

git branch -D bugfix

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

git remote prune origin

答案 29 :(得分:43)

所有其他答案的混搭。在OS X上需要Ruby 1.9.3+,仅测试

调用此文件git-remove,使其可执行,并将其放入您的路径中。然后使用,例如,git remove temp

#!/usr/bin/env ruby
require 'io/console'

if __FILE__ == $0
      branch_name = ARGV[0] if (ARGV[0])
      print "Press Y to force delete local and remote branch #{branch_name}..."
    response = STDIN.getch
    if ['Y', 'y', 'yes'].include?(response)
      puts "\nContinuing."
      `git branch -D #{branch_name}`
      `git branch -D -r origin/#{branch_name}`
      `git push origin --delete #{branch_name}` 
    else
      puts "\nQuitting."
    end
end

答案 30 :(得分:39)

我在.gitconfig文件中添加了以下别名。这允许我删除分支,无论是否指定分支名称。如果没有传入参数,则分支名称默认为当前分支。

[alias]
    branch-name = rev-parse --abbrev-ref HEAD     

    rm-remote-branch = !"f() { branch=${1-$(git branch-name)}; git push origin :$branch; }; f"
    rm-local-branch = !"f() { branch=${1-$(git branch-name)}; git checkout master; git branch -d $branch; }; f"
    rm-branch-fully = !"f() { branch=${1-$(git branch-name)}; git rm-local-branch $branch; git rm-remote-branch $branch; }; f"

答案 31 :(得分:32)

删除远程分支的命令行的另一个选项是 GitHub分支页

例如参见:https://github.com/angular/angular.js/branches

Code - &gt;中找到GitHub存储库的Branches页面。

我自己更喜欢命令行,但 GitHub页面会显示有关分支的更多信息,例如上次更新日期和用户,以及数量提前和落后。处理大量分支时很有用。

答案 32 :(得分:30)

我也有类似的问题,这似乎有效: 这会删除本地分支。 git branch -d the_local_branch

这将删除远程分支 git push origin :the_remote_branch

Source: Makandra Cards

答案 33 :(得分:28)

有很好的答案,但是,如果你有大量的分支机构,在本地和远程一个一个地删除它们将是一项单调乏味的任务。您可以使用此脚本自动执行此任务。

branch_not_delete=( "master" "develop" "our-branch-1" "our-branch-2")


for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`; do

    # delete prefix remotes/origin/ from branch name
    branch_name="$(awk '{gsub("remotes/origin/", "");print}' <<< $branch)"

    if ! [[ " ${branch_not_delete[*]} " == *" $branch_name "* ]]; then
        # delete branch remotly and locally
        git push origin :$branch_name
    fi
done 
  • 列出您不想删除的分支
  • 迭代遥控器分支,如果它们不在我们的“保留列表”中,我们删除了。

来源:removing-git-branches-at-once

答案 34 :(得分:23)

使用 GitBash ,您可以执行以下操作:

git branch --delete <branch>

或者

在GitHub桌面应用中,当您检出分支时,可以通过 Branch 菜单条删除本地分支:

enter image description here

如果你使用GitHub桌面应用程序,并且使用像Visual Studio这样的IDE来进行本地源代码控制,那么您只需要几个简单的步骤:

  1. 查看您要删除的分支以外的分支。
  2. 右键单击要删除的分支。
  3. 从上下文菜单中选择删除选项。
  4. 然后,在线登录您的GitHub帐户后,转到存储库并单击 所有分支 标签。从那里,只需点击您要删除的brach名称右侧的小垃圾桶图标。

    enter image description here

    *请记住 - 如果分支未发布,则无需尝试从在线存储库中删除它。

答案 35 :(得分:19)

我在.bash_aliases文件中创建了以下便捷功能:

git-delete-branch() 
{ 
    if [[ -n $1 ]]; then
        git checkout master > /dev/null;
        branch_name="$1";
        echo "Deleting local $branch_name branch...";
        git branch -D "$branch_name";
        echo "Deleting remote $branch_name branch...";
        git push origin --delete "$branch_name";
        git remote prune origin;
        echo "Your current branches are:";
        git branch -a;
    else
        echo "Usage: git-delete-branch <branch_name>";
    fi
}

答案 36 :(得分:19)

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

在本地删除:

git branch -D usermanagement

在远程位置删除:

git push --delete origin usermanagement

答案 37 :(得分:17)

  

非常简单

删除远程分支

git push -d origin <branch-name>

OR

git push origin :<branch-name>

删除本地分支

git branch -D <branch-name>

答案 38 :(得分:4)

前几种方法对我不起作用,

假设您有以下分支和远程分支,

Local  : Test_Branch
Remote : remotes/origin/feature/Test_FE

为您的本地分支正确设置上游以跟踪您要删除的远程分支。

git branch --set-upstream-to=remotes/origin/feature/Test_FE Test_Branch

然后删除远程分支执行这个

git push origin --delete Test_Branch

然后删除本地分支执行以下命令

git branch -D Test_Branch

就是这样。干杯。

答案 39 :(得分:3)

最灵活的方法是使用custom Git command。例如,在$PATH中的git-rmbranch名称下创建以下Python脚本:

#!/usr/bin/env python3

import argparse
import subprocess
import sys

def rmbranch(branch_name, remote, force):
    try:
        print(subprocess.run(['git', 'branch', '-D' if force else '-d', branch_name],
                             capture_output=True, check=True, encoding='utf-8').stdout, end='')
    except subprocess.CalledProcessError as exc:
        print(exc.stderr.replace(f'git branch -D {branch_name}', f'git rmbranch -f {branch_name}'), end='')
        return exc.returncode

    return subprocess.run(['git', 'push', remote, '--delete', branch_name]).returncode    

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Delete a Git branch locally and remotely.')
    parser.add_argument('-r', '--remote', default='origin', help="The remote name (defaults to 'origin')")
    parser.add_argument('-f', '--force', action='store_true', help='Force deletion of not fully merged branches')
    parser.add_argument('branch_name', help='The branch name')
    args = parser.parse_args()

    sys.exit(rmbranch(args.branch_name, args.remote, args.force))

然后git rmbranch -h将为您显示使用情况信息:

usage: git-rmbranch [-h] [-r REMOTE] [-f] branch_name

Delete a Git branch locally and remotely.

positional arguments:
  branch_name           The branch name

optional arguments:
  -h, --help            show this help message and exit
  -r REMOTE, --remote REMOTE
                        The remote name (defaults to 'origin')
  -f, --force           Force deletion of not fully merged branches

请注意,git push origin --delete <branch_name>还会删除本地远程跟踪分支(默认情况下为origin/<branch_name>),因此无需担心。

答案 40 :(得分:3)

本地

使用命令

git branch -D <branch_name_1> <branch_name_2> <branch_name_1>

来自位置

转到 ~/ProjectLocation/.git/refs/heads/ 可以看到带有分支名称的文件,可以选择和删除文件

远程

使用以下任一 Git 命令

git push origin --delete <branch_name> 
git push origin -d <branch_name>
git push origin :<branch_name>