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

尝试删除远程分支失败:

$ git branch -d remotes/origin/bugfixerror: branch 'remotes/origin/bugfix' not found.
$ git branch -d origin/bugfixerror: branch 'origin/bugfix' not found.
$ git branch -rd origin/bugfixDeleted remote branch origin/bugfix (was 2a14ef7).
$ git pushEverything up-to-date
$ git pullFrom github.com:gituser/gitproject
* [new branch] bugfix -> origin/bugfixAlready up-to-date.

如何在本地和远程正确删除remotes/origin/bugfix分支?

10542722 次浏览

执行摘要

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]
  • gitv2.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]删除远程分支。如果您想从服务器中删除服务器修复分支,您可以运行以下操作:

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

砰。你的服务器上没有更多的分支了。你可能想仔细听一下这个页面,因为你需要那个命令,你可能会忘记语法。记住这个命令的一种方法是回顾我们之前讨论过的git push [remotename] [localbranch]:[remotebranch]语法。如果你省略了[localbranch]部分,那么你基本上就是在说,“不要把任何东西放在我这边,让它成为[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

传播变化。

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

git push --delete origin serverfix

它的作用和

git push origin :serverfix

但它可能更容易记住。

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

grb delete branch

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

马修的回答非常适合删除远程分支,我也很欣赏解释,但要简单区分这两个命令:

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

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

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

提示:当您使用

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 --prune origin

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

git push --mirror

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

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

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

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

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

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

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

然后你可以打电话:

git-shoot branchname

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

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

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

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

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

#!/usr/bin/env rubyrequire 'io/console'
if __FILE__ == $0branch_name = ARGV[0] if (ARGV[0])print "Press Y to force delete local and remote branch #{branch_name}..."response = STDIN.getchif ['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}`elseputs "\nQuitting."endend

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

git checkout some_other_branchgit push origin :branch_to_deletegit branch -d branch_to_delete

如果您删除了远程分支,则不需要远程剪枝。它仅用于获取您正在跟踪的存储库上可用的最新远程对象。我观察到git fetch会添加远程对象,而不是删除它们。这是git remote prune origin实际执行某些操作的示例:

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

git fetchgit remote prune origingit branch -r

简短的回答

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

删除远程分支

git push origin --delete <branch>  # Git version 1.7.0 or newergit 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 versiongit 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 branchesgit fetch <remote> -p      # Shorter

冗长的回答:有三个不同的分支要删除!

当您处理本地和远程删除分支时,请记住有三个不同的分支

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

三个分支的可视化

原始海报使用:

git branch -rd origin/bugfix

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

图2

删除实际的远程分支你需要

git push origin --delete bugfix

图3

补充细节

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

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

请注意,使用git push还将删除本地远程跟踪分支origin/X从命令行中删除远程分支X,因此没有必要使用git fetch --prunegit fetch -p修剪过时的远程跟踪分支。然而,无论如何,如果你这样做也不会有什么坏处。

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

# View just remote-tracking branchesgit branch --remotesgit branch -r
# View both strictly local as well as remote-tracking branchesgit branch --allgit branch -a

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

如果您没有从命令行中删除远程分支X(如上所述),那么您的本地存储库仍将包含(现已过时的)远程跟踪分支origin/X。例如,如果您直接通过GitHub的Web界面删除远程分支,就会发生这种情况。

删除这些过时的远程跟踪分支(从Git版本1.6.6开始)的典型方法是简单地使用--prune或更短的-p运行git fetch请注意,这将删除远程服务器上不再存在的任何远程分支的所有过时的本地远程跟踪分支

git fetch origin --prunegit fetch origin -p # Shorter

以下是来自1.6.6发行说明(强调我的)的相关引用:

"git get"学会了--all--multiple 选项,用于从许多存储库,以及删除远程跟踪的--prune选项这些分支变得陈旧。这些使“git远程更新”和“git远程修剪“不太必要”(没有计划删除“远程”)更新”也不是“远程修剪”)。

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

或者,只需手动删除带有--remotes-r标志的分支,而不是通过git fetch -p您可以避免额外的网络操作修剪过时的本地远程跟踪分支:

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

另见

如果您有一个与远程分支同名的标记,这将不起作用:

$ git push origin :branch-or-tag-nameerror: 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

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

git checkout other_than_branch_to_be_deleted

删除本地分支:

git branch -D branch_to_be_deleted

删除远程分支:

git push origin --delete branch_to_be_deleted

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

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

git branch -d example

(这里example是分支名称。)

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

git push origin :example

简单地说:

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

更容易记住

git push origin :branchName

在本地删除:

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

git branch -d <branch_name>

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

git branch -D <branch_name>

远程删除:

有两种选择:

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

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

现在您可以使用github桌面版应用程序来执行此操作。

启动应用程序后

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

    切换分支

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

    取消发布分支

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

    删除本地分支

删除分支

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

$ git branch -d contact-form

对于删除远程分支:

git push origin --delete contact-form

删除远程分支

git push origin :<branchname>

删除本地分支

git branch -D <branchname>

删除本地分支步骤:

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

本地和远程删除您的分支

  • 签出主分支-git checkout master

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

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

用于删除远程分支的命令行的替代选项是github分支页面

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

在GitHub存储库的Code->Branches页面中找到。

我自己通常更喜欢命令行,但关于分支的GitHub页面向您展示更多信息,例如最后更新日期和用户前面和后面的提交数。在处理大量分支时很有用。

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

我在我的Bash配置文件中添加了以下内容:

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

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

gitdelete my-branch-name

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

用途:

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

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

git branch -D bugfix

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

git remote prune origin

在执行

git branch --delete <branch>

确保您首先通过执行以下命令来确定远程分支的确切名称:

git ls-remote

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

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

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 namebranch_name="$(awk '{gsub("remotes/origin/", "");print}' <<< $branch)"
if ! [[ " ${branch_not_delete[*]} " == *" $branch_name "* ]]; then# Delete branch remotly and locallygit push origin :$branch_namefidone
  • 列出您不想删除的分支
  • 遍历远程分支,如果它们不在我们的“保留列表”中,则删除它们。

来源:立即删除Git分支

单行命令删除本地和远程

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"

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

git branch --delete <branch>

-

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

在此输入图片描述

如果您使用GitHub桌面应用程序不是并使用Visual Studio等IDE进行本地源代码控制,您所要做的就是几个快速步骤:

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

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

在此输入图片描述

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

我将以下别名添加到我的.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"

删除本地-(正常)

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.

图形表示:

在此处输入图片描述

删除分支的步骤:

删除远程分支:

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中的远程和本地分支

我在我的.bash_aliases文件中创建了以下方便的函数:

git-delete-branch(){if [[ -n $1 ]]; thengit 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;elseecho "Usage: git-delete-branch <branch_name>";fi}

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

删除本地:

git branch -D usermanagement

在远程位置删除:

git push --delete origin usermanagement

这很简单:

删除远程分支

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

coolaj86的apenwarr的的答案非常相似。我在两者之间来回切换,试图理解支持子模块替换的更好方法。下面是它们的组合。

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

# Move the folder at prefix to a new branchgit subtree split --prefix=SubFolderName/FolderToBeNewRepo --branch=to-be-new-repo
# Create a new repository out of the newly made branchmkdir ~/Documents/NewRepopushd ~/Documents/NewRepogit initgit pull ~/Documents/OriginalRepo to-be-new-repo
# Upload the new repository to a place that should be referenced for submodulesgit remote add origin git@github.com:myUsername/newRepo.gitgit push -u origin masterpopd
# Replace the folder with a submodulegit rm -rf ./SubFolderName/FolderToBeNewRepogit submodule add git@github.com:myUsername/newRepo.git SubFolderName/FolderToBeNewRepogit branch --delete --force to-be-new-repo

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

# Move the folder at prefix to a new branchgit subtree split --prefix=Assets/SoArchitecture --branch=so-package
# Create a new repository out of the newly made branchmkdir ~/Documents/_Shawn/UnityProjects/SoArchitecturepushd ~/Documents/_Shawn/UnityProjects/SoArchitecturegit initgit pull ~/Documents/_Shawn/UnityProjects/SoProject so-package
# Upload the new repository to a place that should be referenced for submodulesgit remote add origin https://github.com/Feddas/SoArchitecture.gitgit push -u origin masterpopd
# Replace the folder with a submodulegit rm -rf ./Assets/SoArchitecturegit submodule add https://github.com/Feddas/SoArchitecture.gitgit branch --delete --force so-package

最灵活的方法是使用自定义git命令。例如,在您的$PATH中的某个地方以git-rmbranch的名称创建以下Python脚本并使其可执行:

#!/usr/bin/env python3
import argparseimport subprocessimport 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 REMOTEThe remote name (defaults to 'origin')-f, --force           Force deletion of not fully merged branches

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

附注:您可以找到此Git命令这里的最新版本。欢迎提出意见和建议。

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

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

Local : Test_BranchRemote: 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 branch -r --list "origin/*" | xargs git branch -r -D