
我想在本地和远程删除一个分支。
尝试删除远程分支失败
$ 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
分支,我应该做些什么不同的事情?
执行摘要
$ 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 (delete) 学会了尊重 -f (force) 标志。
如果您尝试删除当前选定的分支,您将收到错误消息。
删除远程分支
从 Git v1.7.0 起,您可以使用删除 remote 分支
$ 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那个页面(或者在 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 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 分支?”运行更新答案中的命令后,本地分支仍然存在。如果接受的答案是完整的答案,那就太好了。 Git 让简单任务变得多么困难,这绝对是惊人的……
Matthew's answer 非常适合删除 remote 分支,我也很欣赏解释,但要简单区分这两个命令:
要从您的机器中删除本地分支:
git branch -d {the_local_branch}
(使用 -D
强制删除分支而不检查合并状态)
要从服务器中删除远程分支:
git push origin --delete {the_remote_branch}
@megido 很好 -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 <name>
(例如 git remote prune origin
),以便在本地删除远程中不再存在的陈旧分支。
我想补充一点,如果 -d 没有与当前 HEAD 合并,它会发出警告。如果你需要清晰,我推荐这个命令 git branch -a --merged origin/master
它会列出所有分支,包括本地和远程;已合并到master中。 Additional information here
简短的答案
如果您想对以下命令进行更详细的解释,请参阅下一节中的长答案。
删除远程分支
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
长答案:要删除三个不同的分支!
当您在本地和远程处理删除分支时,请记住涉及三个不同的分支:
本地分支 X。远程源分支 X。本地远程跟踪分支 origin/X 跟踪远程分支 X。
https://i.stack.imgur.com/NLAqw.png
使用的原始海报:
git branch -rd origin/bugfix
这仅删除了他的本地远程跟踪分支 origin/bugfix
,而不是 origin
上的实际远程分支 bugfix
。
https://i.stack.imgur.com/iCONz.png
要删除该实际的远程分支,您需要
git push origin --delete bugfix
https://i.stack.imgur.com/6Z3GY.png
额外细节
以下部分描述了删除远程和远程跟踪分支时要考虑的其他详细信息。
推送删除远程分支也会删除远程跟踪分支
请注意,使用 git push
从命令行删除远程分支 X
也会删除本地远程跟踪分支 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 开始)的典型方法是简单地使用 --prune
或更短的 -p
运行 git fetch
。 请注意,这会删除远程上不再存在的任何远程分支的所有过时的本地远程跟踪分支:
git fetch origin --prune
git fetch origin -p # Shorter
以下是来自 1.6.6 release notes 的相关引用(强调我的):
“git fetch” 学习了 --all 和 --multiple 选项,从许多存储库运行 fetch,以及 --prune 选项来删除过时的远程跟踪分支。这些使“git remote update”和“git remote prune”变得不那么必要(虽然没有计划删除“remote update”或“remote prune”)。
对过时的远程跟踪分支进行上述自动修剪的替代方案
或者,不要通过 git fetch -p
修剪过时的本地远程跟踪分支,您可以通过使用 --remotes
或 -r
手动删除分支来避免进行额外的网络操作标志:
git branch --delete --remotes origin/X
git branch -dr origin/X # Shorter
也可以看看
git-branch(1) 手册页。
git-fetch(1) 手册页。
Pro Git § 3.5 Git 分支 - 远程分支。
@huggie 这非常正确。 Git 中的分支只是附加到提交的书签。因此,在我上面的图表中,本地克隆中有 X
和 origin/X
书签(2 个分支),然后远程有 X
(创建 3 个分支)。
+1 用于远程跟踪分支。当您克隆其他人的分支时,此分支会导致问题。它会继续跟踪您的提交并询问您是否要推送到该人的分支。
为了未来的读者:@Kermit_ice_tea 上面所说的是一个本地分支(如本答案所述),而不是一个远程跟踪分支。当 本地分支 为其配置了“上游分支”时,默认情况下,它将从该远程分支拉取并推送到该远程分支。设置了“上游分支”的 本地分支 是 referred to as a "tracking branch",因此由于术语相似,很容易与 远程跟踪分支 混淆。
我已经阅读了所有的答案,这肯定是迄今为止我读过的最好的答案!--(可能是这一页上最好的答案,期间)。尤其如此,因为它是唯一的答案,它说明了我以前从未知道的这个非常重要的事实:“要删除 3 个不同的分支!”我不知道!这一切现在变得更有意义了,它也为这里的所有其他答案提供了很多启示。谢谢!
应该注意的是,运行 git push origin --delete <branch>
,据我所知,ALSO 也会删除本地存储的名为 origin/branch
的远程跟踪分支。因此,要在一个命令中删除远程分支和本地存储的远程跟踪分支,只需使用 git push origin --delete <branch>
。 然后,您只需使用 git branch -D branch
删除本地分支。这涵盖了仅用 2 个命令删除所有 3 个分支。
删除分支的步骤:
删除远程分支:
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
,它会引发与分支合并状态相关的错误...
我还创建了下面的图像来显示步骤:
https://i.stack.imgur.com/AKWYx.jpg
git branch -a
将显示本地和远程分支。这将有助于您介绍图表。
请注意,如果您在要删除的分支上进行设置,则在删除本地分支之前,您需要检出除您需要删除的分支以外的分支(例如:master)。
当分支在源上被删除时,您的本地存储库不会注意到这一点。您仍然会拥有这些分支的本地缓存版本(这实际上很好),但 git branch -a 仍会将它们列为远程分支。您可以像这样在本地清理该信息:git remote prune origin
您的已删除分支的本地副本不会因此而删除。使用 git fetch --prune
可以达到相同的效果
该图像令人分心且非常大,并且对答案没有任何帮助。我希望这不会成为 SO 的趋势。
您还可以使用以下内容删除远程分支
git push --delete origin serverfix
哪个做同样的事情
git push origin :serverfix
但它可能更容易记住。
...并且使用起来更安全:O
您忘记了有关删除本地分支的部分,可以通过以下方式完成:git branch -d <local_branch>
或 git branch -D <local_branch>
强制删除
这很简单:
删除远程分支
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 branch -a
,
要查看远程分支,您可以使用 git branch -r
我需要使用 --delete
而不是 -d
来删除远程分支。
-d
选项是 --delete
的别名,如果 --delete
有效,那么 -d
也应该有效,如果您想强制删除一个分支,您可以使用 -D
而不是 -d
或 --delete
。
-d
对我不起作用。终端告诉我改用 -D
提示:当您使用删除分支时
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 --prune
或 git fetch -p
。
@RRMadhav,确实在删除后您不会看到已删除的分支,因为对远程分支的引用将在本地为您删除。您团队中已签出该分支的任何其他人仍将拥有该引用并且仍会看到它,除非他们修剪该分支。
如果要删除一个分支,首先checkout到要删除的分支以外的分支。
git checkout other_than_branch_to_be_deleted
删除本地分支:
git branch -D branch_to_be_deleted
删除远程分支:
git push origin --delete branch_to_be_deleted
git branch -D <name-of-branch>
git branch -D -r origin/<name-of-branch>
git push origin :<name-of-branch>
请注意,-D
强制删除。最好使用 -d
,它会提醒您是否需要做一些危险的事情。
啊哈 :) 由你决定:如果你想看到 git 哭,请使用 -d,如果你想哭,请使用 -D。
这很简单:只需运行以下命令:
要在本地和远程删除 Git 分支,首先使用以下命令删除本地分支:
git branch -d example
(这里 example
是分支名称。)
之后,使用以下命令删除远程分支:
git push origin :example
另一种方法是:
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 --镜像;现在他们真的走了!
我最终只是将别名“shoot”添加到我的 .gitconfig shoot = push origin --delete
如果您的来源是 Atlassian Stash 并且分支设置为默认值,您将收到错误消息“默认情况下,拒绝删除当前分支...”。在删除之前,我必须更改 Stash 中的默认分支以指向另一个分支。
正如您所做的那样,这非常简单,但是 fyi git 还允许您制作自定义命令。将 git push origin --delete $1
放入名为 git-shoot
的路径上的文件中,git shoot branchname
也将起作用。
本地删除:
要删除本地分支,您可以使用:
git branch -d <branch_name>
要强制删除分支,请使用 -D
而不是 -d
。
git branch -D <branch_name>
远程删除:
有两种选择:
git push origin :branchname
git push origin --delete branchname
我建议您使用第二种方式,因为它更直观。
如果您想用一个命令完成这两个步骤,您可以通过将以下内容添加到 ~/.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),我不知道为什么,但这很好用!我所做的唯一更改是将 &&
替换为 ;
,这样即使第一个命令失败,第二个命令仍然会执行(有时只存在本地或只存在远程)。
自 2013 年 1 月以来,GitHub 在您的“分支”页面中的每个分支旁边都包含一个删除分支按钮。
我今年才开始使用 Github,所以我想知道为什么这是一个评价如此之高的问题,以及为什么没有一个热门答案建议从 Github 网络界面中删除它!有趣的是,这只是最近添加的。
我要指出这一点。请注意,该按钮不会删除您的本地分支...请参阅此答案以了解如何执行此操作:stackoverflow.com/a/10999165/901641
在本地和远程删除您的分支
结帐到主分支 - git checkout master
删除你的远程分支 - git push origin --delete
删除您的本地分支 - git branch --delete
您也可以使用 git remote prune origin
$ git remote prune origin
Pruning origin
URL: git@example.com/yourrepo.git
* [pruned] origin/some-branchs
它从 git branch -r
列表中修剪和删除远程跟踪分支。
除了其他答案,我经常使用 git_remote_branch 工具。这是一个额外的安装,但它为您提供了一种与远程分支交互的便捷方式。在这种情况下,要删除:
grb delete branch
我发现我也经常使用 publish
和 track
命令。
删除本地和远程的单行命令:
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
是安全的。
假设我们在分支“contact-form”上的工作已经完成,并且我们已经将它集成到“master”中。由于我们不再需要它,我们可以(在本地)删除它: $ git branch -d contact-form
对于删除远程分支:
git push origin --delete contact-form
删除远程分支
git push origin :<branchname>
删除本地分支
git branch -D <branchname>
删除本地分支步骤:
结帐到另一个分支删除本地分支
之后远程分支删除是否需要“git push”?
@SamithaChathuranga 不,git push origin :<branchname>
已经将“空”分支推送到远程(因此删除了远程分支)
简单地说:
git branch -d <branch-name>
git push origin :<branch-name>
如果它是您自己的分支,则此方法有效。但是,如果您要修剪 repo 中所有不需要的分支(其中一些不是您的),那就不够了
本地删除 - (正常)
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.
图示:
https://i.stack.imgur.com/Y7NmS.png
git push origin --delete <branch Name>
比记忆更容易
git push origin :branchName
现在您可以使用 GitHub Desktop 应用程序来做到这一点。
启动应用程序后
单击包含分支的项目 切换到您要删除的分支 从“分支”菜单中,选择“取消发布...”,以从 GitHub 服务器中删除该分支。从“Branch”菜单中,选择“Delete “branch_name”...”,将分支从您的本地机器(也就是您当前正在使用的机器)中删除
我没有投反对票,但我的想法是它没有实质性帮助。问题显然是在无需使用外部程序的情况下要求更多命令行类型的答案,如果人们点击此处,他们可能不会为桌面方式寻找 github。
@Daemedeor,我不同意。在 2010 年,当 OP 提出这个问题时,UI 的方式并不存在,唯一的选择是命令行。为了表明您只需要命令行选项,应在问题中或使用标签 command-line-interface 说明,在这种情况下不存在。
用于删除远程分支的 git 命令很糟糕,我倾向于忘记它(无论是新的还是旧的)。幸运的是,有 GUI 工具可以选择。 Git Gui、TortoiseGit 和 GitHub Desktop 都有它——我希望 Git Extensions 也有这个功能。无论如何,我记得当我需要删除远程分支时,从 Git Extensions 中启动 Git Gui。
如果您有一个与远程分支同名的标签,这将不起作用:
$ 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
这很好,但人们真的不应该首先用相同的名称和相同的命名方案来命名他们的分支和标签。
好吧,我的场景是我正在将分支转换为标签,并且标签与分支具有相同的名称是有意义的。通过转换,我的意思是将分支 B 合并到 A 并用标签 B 标记分支 B 中的最后一次提交,以便在删除分支 B 后,它仍然可以通过简单地签出标签 B 轻松恢复。
More 在 :
上以及为什么deletes
在 git push origin :refs/heads/main
时,我仍然得到相同的错误 error: failed to push some refs to 'https://github.com/tik9/tik9.github.io'
。可能 github
是罪魁祸首。
它不会删除远程分支,我得到 remote: ! Push rejected, cannot delete main branch
许多其他答案将导致错误/警告。这种方法是相对简单的,尽管例如,如果它没有完全合并到 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
我厌倦了在谷歌上搜索这个答案,所以我之前对 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”)以确保更改已合并,然后在成功时推送(将 &&
放在命令之间)
根据使用终端的最新文档,我们可以通过以下方式删除。
本地删除:
git branch -D usermanagement
远程删除:
git push --delete origin usermanagement
我真的不知道为什么 git
命令如此不一致且难以记住。看删除,一个是-D
,另一个是-d|--delete
在 git 版本 2.25.1 中,git branch 也有 -d, --delete
选项。 -D
是 --delete --force
的快捷方式。
利用:
git push origin :bugfix # Deletes remote branch
git branch -d bugfix # Must delete local branch manually
如果您确定要删除它,请运行
git branch -D bugfix
现在清理已删除的远程分支运行
git remote prune origin
版主说明:如果您打算回答这个问题,请注意已经发布了 40 个答案。您的新答案会增加任何实质性价值吗?
注意:对于 Git 2.5+(2015 年第二季度),确切的消息将是“
deleted remote-tracking branch
”:请参阅 github.com/git/git/commit/…跳过前几个答案,直接跳到最好的答案:stackoverflow.com/a/23961231/4561887。要删除 git 分支,实际上有 3 个不同的分支要删除! 这个答案清楚地表明了这一事实。
@GabrielStaples 没有上下文,您的评论令人困惑。 “最佳”评级的答案是否以某种方式错误?
@Nathan,不,他们没有错,但他们不会教你不知道你不知道的东西,而我链接到的那个使这个关键的未知未知成为已知的未知,然后是已知的已知。在我阅读该答案之前,我不知道您有 1) 本地分支、2) 本地存储的远程跟踪分支和 3) 远程分支。在此之前我以为只有本地分支和远程分支。本地存储的远程跟踪分支是一个未知的未知数。让它从那个到一个已知的已知是使这个答案最好的原因。