何时删除Git中的分支?


284

假设我们有一个稳定的应用程序。

明天,有人报告一个重大错误,我们决定立即修复此错误。因此,我们为该修补程序从“ master”创建了一个分支,将其命名为“ 2011_Hotfix”,然后将其向上推送,以便所有开发人员都可以协作修复该修补程序。

我们修复了该错误,并将“ 2011_Hotfix”合并到“ master”以及当前的开发分支中。并推“大师”。

现在如何处理“ 2011_Hotfix”?它是应该永久地作为分支一直呆在那里直到时间结束,还是我们现在应该删除它,因为它已经达到了目的?仅将分支机构留在各处似乎是不干净的,因为分支机构的列表可能会变得很长,大多数分支甚至不再需要。

如果应该删除它,它的历史将会怎样?即使实际的分支不再可用,也可以保留吗?另外,如何删除远程分支?


33
将分支视为思想经常会有所帮助。一个相当好的经验法则是,如果您已经完成了分支代表的想法,包括完成测试并将这些更改合并(将它们合并到主版本中),那么分支本身就已经完成了。
卡斯卡贝尔2011年

3
我想知道的是:如果要删除远程修补程序,是否会为所有协作的开发人员在本地删除它?如果不; 如何做到这一点?我认为一个人可以将该修补程序迁移到master,但是在此之后,所有协作者也应清除该修补程序,以防止他们向该分支添加提交。
rolandow

1
您不能影响同事计算机的本地存储库。您要么告诉他本地删除分支,要么还可以使用git hooks / branch安全性强制此服务器端,以防止从您要保留删除的分支中进行推送
srz2,2016年

Answers:


183

您可以使用来安全地删除分支git branch -d yourbranch。如果它包含未合并的更改(即,您将通过删除分支而丢失提交),则git会告诉您,并且不会删除它。

因此,删除合并的分支很便宜,并且不会丢失任何历史记录。

要删除远程分支,请使用git push origin :mybranch,假设您的远程名称是origin,并且要删除的远程分支名为mybranch。


35
“删除合并的分支很便宜”,但保持不变也是如此。如果保持不变,就git使用的时间或空间而言,不会对性能造成重大影响。就是说,我将删除该分支,因为的历史中所有提交都已存在master,因此确实使事情变得更加整洁。
MatrixFrog 2011年

22
我想要删除分支的原因之一是:我们对分支做了很多更改(实际上是所有更改),因此最终在使用命令“ git branch”时会得到一长串。对于概述,我想缩短该列表。这样旧的分支将被删除。Reale版本带有标签,因此对我而言不在此讨论中。
michel.iamit 2014年

7
尽管我同意删除已经合并的分支,但是如果您想查看尚未合并到当前分支的分支列表,则可以使用:git branch --no-merged
lsklyut 2014年

51
@MatrixFrog就git而言,保持便宜很便宜,但是人力成本会变得昂贵。我刚进入一个大约有40个分支的项目,所有分支都带有数字分支名称。我不知道什么是什么,这些分支中的几乎每个分支都是陈旧的。搜索这些分支并弄清楚什么是累人并且需要时间的开销。是的,从技术上讲它很便宜,但实际上并非如此。我喜欢保持git repo的形状。如果它不在活动开发环境中并且已被合并,则将其删除。但这只是我的MO,我尊重他人可能会做一些不同的事情。
dudewad

1
什么是--no-merged默认命令?我尝试过git config --global --add branch.noMerged true并添加了它,但没有任何区别。
Craig Silver

55

您需要做的是标记您发布的所有内容。积极发展时,请保留分支机构。

删除旧分支

git branch -d branch_name

使用以下命令从服务器中删除它们

git push origin --delete branch_name

或旧语法

git push origin :branch_name

内容为“从源头不将任何内容推送到branch_name中”。

就是说,只要DAG(有向无环图)可以指向它,提交就将存在于历史中。

Google的“ git-flow”,可能会提供有关发布管理,分支和标记的更多信息。


31

由于问题带有“ github”标签,因此我还要添加它:特别是在Github中,如果您请求分支的请求并合并(通过UI或合并请求请求的分支),则不会即使删除分支也会丢失拉取请求数据(包括注释)。

这样做的后果是:如果将拉取请求作为工作流程的一部分(与代码审查完美地融合在一起),则可以在分支合并后安全地删除它们。这是如此普通,以至于最近Github添加了一个(甜)功能,在合并拉取请求后立即弹出“删除分支”按钮。

但是,值得注意的是,每个组都应采用最适合它的工作流程(它可能会或可能不会导致删除此类分支)。例如,我目前的工作团队在合并其拉取请求后立即修剪所有与主服务器或部署无关的分支(例如,生产,暂存等),并且我们仍然全面跟踪相关提交的形成方式每个产品的每次增量改进。

当然,没有历史记录管理(拉动请求或其他方式)会替换正确的版本标记(最好使用与部署/打包版本相同的工具/脚本来自动进行标记),因此您始终可以快速切换到碰巧遇到的用户在给定的时刻。标记也是解决原始问题的关键:如果您确定可以并且应该删除任何合并到“工作”分支的分支,并且不能合并任何合并到版本标签,“生产”等的分支。 ,您将始终拥有这些修复程序,直到将它们集成到将来的版本中为止。


2
感谢您解释为什么Github向我显示“删除分支”按钮。
Todd Owen

我们正在使用sourcetree,它提供了使本地修补程序分支和远程修补程序分支保持打开状态的选项。 我以为关闭修补程序分支意味着删除它,并且您无法重复使用它。例如,我们需要在接下来的5天内每天发布修补程序。然后我们关闭它。但是,假设在第6天,我们需要另一个修补程序。我们是否创建一个新的修补程序分支?
Danger14年

人们通常这样做。如果单独命名它们是不可行的,则可以根据日期或管理它们的票证系统的参考(如果有)来命名它们。当然,git工作流应该以“最适合您的团队的方式”应用,所以不要担心如果您决定以其他方式工作。
chesterbr

7

我要补充一点,删除分支的缺点是您将破坏GitHub上那些分支的任何超链接(此问题标记为github)。404 Not Found这些链接会出错。这就是为什么我在GitHub上删除分支后将链接更改为指向提交或标记的原因。

因为某些链接无法更改,例如电子邮件中的链接,所以我现在避免完全链接到GitHub分支,并从第一天开始链接到提交或标签。

我更喜欢在合并分支之后将其删除。这可以防止存储库中一长串分支的视觉混乱。这些分支也将传播到存储库的所有分支。

首先,我删除我的本地分支。这样可以防止以后意外推动它。

git branch -d branchName

然后我删除远程跟踪分支

git branch -dr remoteName\branchName

然后我删除GitHub上的分支。我使用Web界面,但是下面是等效命令。

git push remoteName :branchName

即使分支从未合并,通常我还是希望保留提交以供后代使用。但是,我仍然想删除该分支。为了分散提交并防止垃圾收集器将其占用,我制作了一个带注释的标签,该标签指向与已删除分支相同的提交。

git tag -a tagName commitOrBranchName

然后我将标签推到github

git push remoteName tagName

垃圾收集器何时吃掉分支的提交?在删除分支之前,是否需要标记并推送标记?
贾里德·瑟斯克


4

看来您要删除2011_Hotfix分支而不丢失其历史记录。我将首先讨论删除,然后讨论历史。

git上面已经描述了常用的分支删除方法,并且它们按预期工作。git没有一个或两个单词的命令,表示“嘿git,删除本地和远程分支。” 但是可以通过shell脚本模仿这种行为。例如,以Zach Holman的shell脚本'git-nuke'为例。这很简单:

#!/bin/sh
git branch -D $1
git push origin :$1

将其放在git-nuke您的$PATH目录之一的可执行文件中(例如)。如果您不在2011_Hotfix分支上,则只需运行git-nuke 2011_Hotfix即可删除本地和远程分支。这比标准git命令更快,更简单(尽管可能更危险)。

您对保存历史的关注是一件好事。在这种情况下,您不必担心。合并2011_Hotfix到后master,来自的所有提交2011_Hotfix都将添加到master的提交历史记录中。简而言之,您不会因为简单的合并而丢失历史记录。

我要补充一句话,这也许超出了您的问题范围,但仍然有意义。假设有20个微小的“正在进行中的”提交2011_Hotfix;但是,您只希望将一次完整的提交2011_Hotfix添加到master的历史记录中。您如何将所有20个小提交合并为一个大提交?幸运的是,git允许您使用将多个提交合并为一个提交git-rebase。我在这里不会解释它是如何工作的。不过,如果您有兴趣,的文档git-rebase非常有用。请注意,它会git rebase重写历史记录,因此,应谨慎使用它,特别是如果您不熟悉它。最后,您的2011_Hotfix方案是关于开发团队的,而不是关于单独开发的。如果项目团队成员使用git rebase,对于团队来说,有一个明确的使用准则是明智的,这样团队git rebase中的某些牛仔开发人员就不会无意间破坏项目的git历史。


3

如果它已经成功地合并了,甚至可能被标记了,那么我会说它已经没有用了。这样您就可以放心地做git branch -d branchname


2

如果要修剪从源中删除的本地分支,也可以在使用时修剪 git fetch

git fetch --prune

0

您可以在所有主要的Web UI(例如github,BitBucket)中删除分支。在线删除分支后,您可以使用删除本地分支

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.