2011-03-16 107 views
210

假设我们有一个稳定的应用程序。何时删除Git中的分支?

明天,有人会报告我们决定立即修复的一个大酒吧错误。因此,我们创建一个分支与该修补程序关“高手”,我们将其命名为“2011_Hotfix”,我们向上推,使所有的开发人员可以修复它合作。

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

我们做什么用“2011_Hotfix”现在呢?它是否应该永远坐在那里作为一个分支直到时间的尽头,或者我们现在应该删除它,因为它符合它的目的?由于分支机构的名单可能会变得很长,而且大部分都不再是必要的,所以看起来不太清楚分支机构到处都是。

在它应该被删除的情况下,会发生什么历史?即使实际分支不再可用,这是否会被保留?另外,我将如何删除远程分支?

+20

通常可以将分支视为想法。一个相当好的经验法则是,如果你已经完成了分支所代表的想法 - 包括完成测试并合并这些改变(将它们合并成主) - 你就完成了分支本身。 – Cascabel 2011-03-17 04:30:16

+2

我想知道的是:如果远程修补程序正在被删除,它会在本地为所有合作的开发者删除吗?如果不;如何做到这一点?我认为有人将修补程序迁移到master,但在此之后,还应该清除所有协作者,以防止它们向该分支添加提交。 – rolandow 2015-12-22 10:17:02

+0

您不能影响您的同事电脑的本地存储库。你要么告诉他在本地删除分支,要么你也可以用git hooks/branch security来强制执行这个服务器端,以防止你的分支被推到你想要删除的地方 – srz2 2016-02-12 15:10:08

回答

130

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

所以,删除合并分支便宜,不会让你失去任何历史。

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

+25

“删除一个合并的分支很便宜”它周围。如果你保持它的话,那么在git使用的时间或空间方面没有明显的性能影响。也就是说,我会删除这个分支,因为所有提交已经存在于'master'的历史记录中,所以它确实使事情变得更加简洁。 – MatrixFrog 2011-03-17 03:37:58

+13

我想要删除分支的原因之一是:我们对分支进行了很多更改(实际上,所有更改),因此最终在使用命令“git分支”时会得到一长串列表。对于概述,我想缩短这个列表。所以旧的分支将被删除。 Reale版本被加了标签,所以不在我这个讨论中。 – 2014-05-21 06:59:15

+5

虽然我同意删除已经合并的分支,但是如果你想看到还没有合并到你当前分支的分支列表,你可以使用: git分支 - 不合并 – lsklyut 2014-09-29 13:54:13

1

如果它已成功合并回来,甚至可能被标记,那么我会说它已经没有用了。所以你可以安全地做git branch -d branchname

41

你需要做的是你释放标签什么。当你积极发展时,保持分支。

删除老枝与

git branch -d branch_name 

从服务器中删除他们

git push origin --delete branch_name 

或旧的语法

git push origin :branch_name 

其内容为 “没有推入branch_name在原产地” 。

也就是说,只要DAG(有向无环图)可以指向它,提交就会在历史中出现。

谷歌“git-flow”,这可能会提供一些关于发布管理,分支和标记的更多见解。

25

由于问题具有“github上”的标签,我也补充一点:在Github具体地说,如果您拉请求一个分支,它被合并(通过用户界面或者通过合并拉请求的分支),即使你删除分支你不会失去拉请求数据(包括注释),

这样做的一个后果:如果您将拉取请求作为工作流程的一部分(与代码审阅完美融合),您可以在合并后尽快删除分支。这很常见,以至于最近Github添加了一个(甜)功能,在合并请求后弹出一个“删除分支”按钮。

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

当然,没有历史管理(拉取请求或其他)会替换版本的正确标记(您最好使用部署/打包版本的相同工具/脚本自动化),所以您可以随时快速切换到任何用户恰好在某个特定的时刻。标记也是解决原始问题的关键:如果您确定合并到“工作”分支的任何分支可以并且应该被删除,并且任何合并到版本标签,“生产”等的分支不应该,您将始终拥有修补程序,直到它们被集成到未来的版本中。

+1

感谢您解释为什么Github向我展示了一个“删除分支”按钮。 – 2014-06-15 02:56:15

+0

我们使用sourcetree,它提供了保持本地修补程序分支和远程修补程序分支打开的选项。 **我认为关闭修补程序分支意味着删除它,并且您不能重新使用它。我们需要在接下来的5天内每天推送热修复程序。然后我们关闭它。但是,让我们说在第6天,我们需要另一个修补程序。我们是否创建了新的修补程序分支? – Danger14 2015-07-01 16:43:56

+0

这就是人们通常所做的。如果单独命名它们是不可行的,您可以根据当天的名称或管理它们的售票系统的参考资料(如果有的话)命名它们。当然,git工作流程应该应用于“适合您的团队的最佳组合”的基础上,所以如果您决定以不同的方式工作,请不要担心。 – chesterbr 2015-07-04 04:33:42

6

我会补充说,删除分支的缺点是你会打破任何超链接到GitHub上的这些分支(这个问题被标记为github)。这些链接会出现404 Not Found错误。这就是为什么我在GitHub上删除分支后,将链接更改为指向提交或标记。

由于某些链接无法更改,例如在电子邮件中,我现在完全避免超链接到GitHub分支,并从第一天链接到提交或标记。

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

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

git branch -d branchName 

然后我删除远程跟踪分支

git branch -dr remoteName\branchName 

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

git push remoteName :branchName 

即使分支从不合并,通常我仍然希望保留子孙后代的提交。不过,我仍然想删除分支。为了传播提交,并防止它们被垃圾收集器吃掉,我创建了一个带注释的标记,指向与已删除分支相同的提交。

git tag -a tagName commitOrBranchName 

然后我推标签GitHub的

git push remoteName tagName 
3

看来你要删除的2011_Hotfix分支不失它的历史。我将首先讨论删除,然后再讨论历史。

上面已经描述了通常的git分支删除方法,它们按预期工作。git没有一个或两个字的命令,这意味着,“嘿git,同时删除本地和远程分支”。但是这种行为可以通过shell脚本来模拟。例如,拿Zach Holman's shell script 'git-nuke'。这是非常简单的:在你的$PATH目录之一

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

把这个可执行文件(例如,git-nuke)。如果您不在2011_Hotfix分支上,只需运行git-nuke 2011_Hotfix就会删除本地和远程分支。这比标准的git命令更简单 - 尽管可能更危险。

您对保存历史的关注是一个不错的选择。在这种情况下,你不必担心。一旦你合并2011_Hotfixmaster,所有来自2011_Hotfix的提交将被添加到master的提交历史。总之,你不会因为简单的合并而失去历史。

我还有一句话要补充说,这可能超出了你的问题的范围,但仍然是相关的。让我们假设在2011_Hotfix上有20个小小的“正在进行中”提交;不过,您只需要将2011_Hotfix的一个完整提交添加到master的历史记录中。你如何将20个小提交合并为一个大提交?幸运的是,git允许您通过使用git-rebase将多个提交合并为一个提交。我不会在这里解释这是如何工作的;尽管如果你有兴趣,the documentation for git-rebase非常好。请注意0​​重写历史记录,所以应该谨慎使用它,特别是如果你是新手。最后,你的2011_Hotfix场景是关于一个开发团队,而不是一个独立开发者。如果项目团队成员使用git rebase,团队明智地指定使用git rebase以便团队中的某位牛仔开发人员不会在无意中损害项目的历史记录git

0

您可以删除所有主要网络用户界面(如github,BitBucket)中的分支。在线删除分支后,您可以使用删除本地分支

git remote prune origin