【问题标题】:How do I delete a Git branch locally and remotely?如何在本地和远程删除 Git 分支?
【发布时间】:2011-01-01 11:44:43
【问题描述】:

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

尝试删除远程分支失败

$ 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 分支,我应该做些什么不同的事情?

【问题讨论】:

  • 版主说明:如果您打算回答这个问题,请注意已经发布了 40 个答案。您的新答案会增加任何实质性价值吗?
  • 注意:对于 Git 2.5+(2015 年第二季度),确切的消息将是“deleted remote-tracking branch”:请参阅 github.com/git/git/commit/…
  • 跳过前几个答案,直接跳到最好的答案:stackoverflow.com/a/23961231/4561887。要删除一个 git 分支,实际上有 3 个不同的分支要删除! 这个答案清楚地说明了这一事实。
  • @GabrielStaples 没有上下文,您的评论令人困惑。 “最佳”评分的答案是否有错误?
  • @Nathan,不,他们没有错,但他们不会教你不知道你不知道的东西 ,而我链接到的那个使这个关键的 unknown unknown 变成 known unknown 然后是 known known。在我阅读该答案之前,我不知道您有 1) 本地分支、2) 本地存储的远程跟踪分支和 3) 远程分支。在此之前,我认为只有一个本地分支远程分支。本地存储的远程跟踪分支是一个unknown unknown。让它从那个变成一个已知的才是最好的答案。

标签: git version-control git-branch git-push git-remote


【解决方案1】:

执行摘要

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

注意:在大多数情况下,&lt;remote_name&gt; 将是 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 章:

删除远程分支

假设你完成了一个远程分支——比如说,你和你的合作者完成了一个特性,并将它合并到你的远程主分支(或者你的稳定代码行所在的任何分支)。您可以使用相当钝的语法git push [remotename] :[branch] 删除远程分支。如果要从服务器中删除 server-fix 分支,请运行以下命令:

$ 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 那个页面(或者通过在 StackOverflow 上回答这个问题几乎是狗耳朵)。

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

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

传播更改。

【讨论】:

  • 在服务器上删除远程分支后,别忘了在其他机器上做一个git fetch --all --prune。 |||在用git branch -d 删除本地分支并用git push origin --delete 删除远程分支后,其他机器可能仍然有“过时的跟踪分支”(看到它们做git branch -a)。要摆脱这些,请执行git fetch --all --prune
  • 除了@TrevorBoydSmith 的git branch -a 可以查看所有分支,还可以使用git branch -r 仅查看远程分支。另见git remote show origin - 来源:gitready.com/intermediate/2009/02/13/list-remote-branches.html
  • 我必须运行 git branch -D Branch_Name 才能摆脱本地分支
  • @KolobCanyon 如果分支没有被合并到另一个分支,你只需要使用 -D。
  • 问题是 “我需要做些什么不同的事情才能在本地和 GitHub 上成功删除 remotes/origin/bugfix 分支?”运行更新答案中的命令后,本地分支仍然存在。如果接受的答案是 complete 答案,那就太好了。 Git 使简单任务变得如此困难,这绝对是惊人的……
【解决方案2】:

前几个方法对我不起作用。

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

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

就是这样。

【讨论】:

  • git push &lt;remote_name&gt; :&lt;branch_name&gt; 真的不行吗?在你的情况下git push origin :Test_FE。这在 11 年前发布的投票最多、接受的答案中列出。
  • 抱歉,应该是:feature/Test_FE
  • 是的。可能是因为目录不起作用。使用正确的命名它应该可以工作,因为我可以看到赞成票的数量。但我想分享我学到的东西。谢谢
【解决方案3】:

您可以在此处删除对应于 glob 或任何分支名称的远程分支:

git branch -r --list "origin/*" | xargs git branch -r -D

【讨论】:

    【解决方案4】:

    很简单:

    删除远程分支

    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
    

    【讨论】:

    • 我需要使用--delete 而不是-d 来删除远程分支。
    • -d 选项是--delete 的别名,如果--delete 有效,那么-d 也应该有效,如果您想删除一个分支,您可以使用-D 而不是@ 987654334@ 或 --delete.
    • -d 对我不起作用。终端告诉我改用-D
    【解决方案5】:

    CoolAJ86'sapenwarr's 的答案非常相似。我在两者之间来回走动,试图了解支持子模块替换的更好方法。下面是它们的组合。

    首先将 Git Bash 导航到要拆分的 Git 存储库的根目录。在我的例子中是~/Documents/OriginalRepo (master)

    # Move the folder at prefix to a new branch
    git subtree split --prefix=SubFolderName/FolderToBeNewRepo --branch=to-be-new-repo
    
    # Create a new repository out of the newly made branch
    mkdir ~/Documents/NewRepo
    pushd ~/Documents/NewRepo
    git init
    git pull ~/Documents/OriginalRepo to-be-new-repo
    
    # Upload the new repository to a place that should be referenced for submodules
    git remote add origin git@github.com:myUsername/newRepo.git
    git push -u origin master
    popd
    
    # Replace the folder with a submodule
    git rm -rf ./SubFolderName/FolderToBeNewRepo
    git submodule add git@github.com:myUsername/newRepo.git SubFolderName/FolderToBeNewRepo
    git branch --delete --force to-be-new-repo
    

    下面是上面的副本,替换了可自定义的名称并改用 HTTPS。根文件夹现在是~/Documents/_Shawn/UnityProjects/SoProject (master)

    # Move the folder at prefix to a new branch
    git subtree split --prefix=Assets/SoArchitecture --branch=so-package
    
    # Create a new repository out of the newly made branch
    mkdir ~/Documents/_Shawn/UnityProjects/SoArchitecture
    pushd ~/Documents/_Shawn/UnityProjects/SoArchitecture
    git init
    git pull ~/Documents/_Shawn/UnityProjects/SoProject so-package
    
    # Upload the new repository to a place that should be referenced for submodules
    git remote add origin https://github.com/Feddas/SoArchitecture.git
    git push -u origin master
    popd
    
    # Replace the folder with a submodule
    git rm -rf ./Assets/SoArchitecture
    git submodule add https://github.com/Feddas/SoArchitecture.git
    git branch --delete --force so-package
    

    【讨论】:

      【解决方案6】:

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

      在本地删除:

      git branch -D usermanagement
      

      远程删除:

      git push --delete origin usermanagement
      

      【讨论】:

      • 我真的不知道为什么git 命令如此不一致且难以记忆。看删除,一个是-D,另一个是-d|--delete
      【解决方案7】:

      删除分支的步骤:

      删除远程分支:

      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 branch -a 将显示本地和远程分支。它将帮助您介绍图表。
      • 请注意,如果您在要删除的分支上进行设置,则需要在删除本地分支之前签出您需要删除的分支以外的分支(例如:master)。
      • 当分支在原点被删除时,您的本地存储库不会注意到这一点。您仍将拥有这些分支的本地缓存版本(这实际上很好),但 git branch -a 仍会将它们列为远程分支。您可以像这样在本地清理该信息:git remote prune origin 您的已删除分支的本地副本不会因此而被删除。使用git fetch --prune实现同样的效果
      • 图片令人分心,而且非常大,对答案没有任何帮助。我希望这不会成为 SO 的趋势。
      【解决方案8】:

      删除本地 - (正常)

      git branch -d my_branch
      

      如果您的分支处于变基/合并进度并且未正确完成,则意味着您将收到错误 Rebase/Merge in progress,因此在这种情况下,您将无法删除您的分支。

      所以要么你需要解决变基/合并。否则,您可以使用 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.
      

      图形表示:

      【讨论】:

        【解决方案9】:

        使用Git Bash可以执行以下操作:

        git branch --delete <branch>
        

        或者

        -

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

        如果您使用 GitHub 桌面应用程序,而是使用 Visual Studio 之类的 IDE 进行本地源代码控制,那么您只需快速步骤:

        1. 检查除您要删除的分支之外的分支。
        2. 右键单击要删除的分支。
        3. 从上下文菜单中选择删除选项。

        然后,在线登录到您的 GitHub 帐户后,转到存储库并单击 All Branches 选项卡。从那里,只需单击要删除的分支名称右侧的小垃圾桶图标。

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

        【讨论】:

        • 我在 GitHub 网站上看不到这些 OverviewYoursActiveStateAll branches 选项卡。看起来这是一个旧快照。在Code 选项卡下,我看到了提交、分支、发布和贡献者等子选项卡。当我是存储库的所有者时,我会看到一个名为 MIT 的附加选项卡。
        • git branch --delete &lt;branch&gt; 不会删除远程分支,您需要 git push &lt;server&gt; --delete &lt;branch&gt; 来执行此操作
        【解决方案10】:

        一个单行命令删除本地和远程

        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"
        

        【讨论】:

        • ⚠️ 在脚本中谨慎使用git branch -D,因为它会强制删除分支而不检查它是否已合并。使用-d 是安全的。
        【解决方案11】:

        有很好的答案,但是,如果您有大量的分支,在本地和远程一个一个地删除它们,将是一项繁琐的任务。您可以使用此脚本自动执行这些任务。

        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

        【讨论】:

        • 在链接到您作为作者的外部资源时,您必须披露隶属关系。
        【解决方案12】:

        执行前

        git branch --delete <branch>
        

        确保您首先通过执行来确定远程分支的确切名称是什么:

        git ls-remote
        

        这将告诉您为&lt;branch&gt; 值输入的内容准确。 (branch 区分大小写!)

        【讨论】:

          【解决方案13】:

          用途:

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

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

          git branch -D bugfix
          

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

          git remote prune origin
          

          【讨论】:

            【解决方案14】:

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

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

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

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

            gitdelete my-branch-name
            

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

            【讨论】:

            • 对此进行扩展,--delete "$@"-D "$@" 而不是 $1 将为多个分支处理它。
            • 我建议先运行git branch -d(带有小写'd')以确保更改已合并,如果成功则推送(在命令之间放置&amp;&amp;
            【解决方案15】:

            现在您可以使用GitHub Desktop 应用程序来实现。

            启动应用程序后

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

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

            4. 从“分支”菜单中,选择“删除“branch_name”...',将分支从您的本地机器(也就是您当前正在使用的机器)上删除

            【讨论】:

            • 我没有投反对票,但我认为这并没有实质性帮助。问题显然是在无需使用外部程序的情况下要求更多命令行类型的答案,如果人们点击此处,他们可能不会为桌面方式寻找 github。
            • @Daemedeor,我不同意。在 2010 年,当 OP 提出这个问题时,UI 的方式并不存在,唯一的选择是命令行。为了表明您只需要命令行选项,应在问题中或标签中说明,command-line-interface,在这种情况下不存在。
            • 删除远程分支的 git 命令很糟糕,我倾向于忘记它(新旧)。幸运的是,有 GUI 工具可以选择。 Git Gui、TortoiseGit 和 GitHub Desktop 都有它——我希望 Git Extensions 也有这个功能。无论如何,我记得当我需要删除远程分支时,从 Git Extensions 中启动 Git Gui。
            【解决方案16】:

            在本地删除:

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

            git branch -d <branch_name>
            

            要强制删除分支,请使用-D 而不是-d

            git branch -D <branch_name>
            

            远程删除:

            有两种选择:

            git push origin :branchname
            
            git push origin --delete branchname
            

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

            【讨论】:

              【解决方案17】:

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

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

              git branch -d example
              

              (这里example是分支名称。)

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

              git push origin :example
              

              【讨论】:

                【解决方案18】:

                简短答案

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

                删除远程分支

                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,而不是origin上的实际远程分支bugfix

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

                git push origin --delete bugfix
                

                其他细节

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

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

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

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

                这是来自1.6.6 release notes(强调我的)的相关引用:

                "git fetch" 学习了 --all--multipleoptions,从中运行 fetch 许多存储库,以及 --prune 选项来删除远程跟踪 过时的分支。 这些使“git 远程更新”和“git 远程修剪”不太必要(没有计划删除“远程 更新”或“远程修剪”)。

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

                或者,不要通过 git fetch -p 修剪过时的本地远程跟踪分支,您可以避免进行额外的网络操作,只需使用 --remote 手动删除分支或-r标志:

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

                另见

                【讨论】:

                • @huggie 这非常正确。 Git 中的分支只是附加到提交的书签。所以在我上面的图表中,本地克隆中有Xorigin/X书签(2个分支),然后远程有X(3个分支)。
                • +1 表示远程跟踪分支。当您克隆其他人的分支时,此分支会导致问题。它会继续跟踪您的提交并询问您是否要推送到该人的分支。
                • 为了未来的读者:@Kermit_ice_tea 上面所说的是 local 分支(如本答案所述),而不是 remote-tracking 分支。当 本地分支 为其配置了“上游分支”时,默认情况下,它将从该远程分支拉取并推送到该远程分支。设置了“上游分支”的本地分支referred to as a "tracking branch",因此由于术语相似,很容易与远程跟踪分支混淆。跨度>
                • 我已经阅读了所有的答案,这肯定是迄今为止我读过的最好的答案!--(可能是本页上最好的答案,期间)。尤其如此,因为它是唯一的答案,它说明了我以前从未知道的这个非常重要的事实:“要删除 3 个不同的分支!”我不知道!这一切现在变得更有意义了,它也为这里的所有其他答案提供了很多启示。谢谢!
                • 应该注意的是,运行git push origin --delete &lt;branch&gt;,据我所知,还删除了本地存储的名为origin/branch 的远程跟踪分支。因此,要在一个命令中删除远程分支和本地存储的远程跟踪分支,只需使用git push origin --delete &lt;branch&gt; 然后,您只需使用git branch -D branch 删除本地分支。这涵盖了仅用 2 个命令删除所有 3 个分支。
                【解决方案19】:

                许多其他答案会导致错误/警告。这种方法相对来说是万无一失的,尽管例如,如果它没有完全合并到 some_other_branch 中,您可能仍然需要 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
                

                【讨论】:

                  【解决方案20】:

                  这是所有其他答案的混搭。它需要 Ruby 1.9.3+,并且在 OS X 上进行了测试。

                  将此文件称为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
                  

                  【讨论】:

                  • @chhh 那么您需要扩展此功能以使其成为变量而不是假设。
                  • 抱歉,但是安装 Ruby 来完成这种工作?更合乎逻辑的是在 bash 上的实现,它可以开箱即用。
                  • @Reishin Ruby 就像 Bash 一样安装在盒子上,至少在 OSX 上是这样。请参阅:stackoverflow.com/questions/2342894/…,该主题已被 SO 丢弃为基于意见。
                  • @Yar 此链接脱离上下文,范围更广。我只讲 git,因为主题不仅仅起源于 OSX,因此选择对于其他系统(例如 *UNIX、Windows)来说很奇怪
                  【解决方案21】:

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

                  【讨论】:

                  • 这就是我要找的。我自己的 shell 函数别名不起作用(意外 EOF),我不知道为什么,但这很好用!我所做的唯一更改是将&amp;&amp; 替换为;,这样即使第一个命令失败,第二个命令仍然会执行(有时只存在本地或只存在远程)。
                  【解决方案22】:

                  另一种方法是:

                  git push --prune origin
                  

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

                  git push --mirror
                  

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

                  【讨论】:

                  • git push --prune origin 在 gitlab 上没有为我做任何事情: git clone git://repo.git; git 分支 -d -r 起源/一些分支; git push --prune 起源;产量:一切都是最新的;混帐获取;恢复本地删除的分支; git push --镜像;现在他们真的走了!
                  【解决方案23】:

                  提示:当您使用删除分支时

                  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

                  【讨论】:

                  • 你应该澄清一下,上面的git push操作删除了本地分支远程分支。
                  • 请注意,git remote prune 是删除过时远程跟踪分支的一种有些过时的方法,较新的方法是使用 git fetch --prunegit fetch -p
                  • @RRMadhav,确实在删除后您不会看到已删除的分支,因为对远程分支的引用将在本地为您删除。您团队中已签出该分支的任何其他人仍将拥有该引用并且仍然会看到它,除非他们修剪该分支。
                  【解决方案24】:

                  Matthew's answer 非常适合删除 remote 分支,我也很欣赏解释,但要简单区分这两个命令:

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

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

                  要从服务器中删除远程分支

                  git push origin --delete {the_remote_branch}

                  参考:Git: Delete a branch (local or remote)

                  【讨论】:

                  • @megido well -D 强制删除,-d 如果尚未合并,则会发出警告。
                  • 如果您的本地分支未与 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'. 的错误
                  • 我建议使用 -d 而不是 -D 因为它更安全。如果 -d 由于未合并的提交而失败,那么您需要对其进行评估,如果可以删除,则使用 -D。
                  • 其他具有已删除远程分支的存储库克隆应运行git remote prune &lt;name&gt;(例如git remote prune origin),以便在本地删除远程中不再存在的陈旧分支。
                  • 我想补充一点,如果 -d 未与当前 HEAD 合并,则会发出警告。如果你需要清晰,我推荐这个命令git branch -a --merged origin/master 它会列出任何分支,本地和远程;已合并到master中。 Additional information here
                  【解决方案25】:

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

                  grb delete branch
                  

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

                  【讨论】:

                    【解决方案26】:

                    最灵活的方法是使用custom Git command。例如,在 $PATH 的某个位置创建以下 Python 脚本,名称为 git-rmbranch,并使其可执行:

                    #!/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 &lt;branch_name&gt; 还会删除本地远程跟踪分支(默认为origin/&lt;branch_name&gt;),因此无需关心。

                    附:你可以找到这个 Git 命令的最新版本here。欢迎提出意见和建议。

                    【讨论】:

                    • 安装 Python 来做某事 git 本身做得很好,并不是真正的解决方案。更像是一个编程练习。
                    • @Mogens Python 已经预装在大多数健全的发行版中。仅使用 git 您不能:1)自定义输出(例如,使其更加一致) 2)以所需的方式组合多个命令 3)轻松自定义逻辑。此外,一遍又一遍地输入相同的命令很无聊。
                    【解决方案27】:
                    git push origin --delete <branch Name>
                    

                    更容易记住
                    git push origin :branchName
                    

                    【讨论】:

                      【解决方案28】:

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

                      git push --delete origin serverfix
                      

                      做同样的事情
                      git push origin :serverfix
                      

                      但它可能更容易记住。

                      【讨论】:

                      • ...使用更安全:O
                      • 您忘记了删除本地分支的部分,可以通过git branch -d &lt;local_branch&gt;git branch -D &lt;local_branch&gt;强制删除
                      【解决方案29】:

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

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

                      然后你可以调用:

                      git-shoot branchname
                      

                      【讨论】:

                      • 我最终只是将别名“shoot”添加到我的 .gitconfig shoot = push origin --delete
                      • 如果您的源是 Atlassian Stash 并且分支设置为默认,您将收到错误“默认情况下,拒绝删除当前分支...”。在删除之前,我必须更改 Stash 中的默认分支以指向另一个分支。
                      • 这非常简单,因为您已经完成了它,但仅供参考 git 还允许您制作自定义命令。将git push origin --delete $1 放在路径上名为git-shoot 的文件中,git shoot branchname 也可以。
                      【解决方案30】:

                      您也可以使用git remote prune origin 执行此操作

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

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

                      【讨论】:

                        猜你喜欢
                        • 2021-08-22
                        • 2018-09-29
                        相关资源
                        最近更新 更多