何时删除Git中的分支?

时间:2011-03-16 18:41:38

标签: git github version-control git-branch git-gui

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

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

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

我们现在如何处理“2011_Hotfix”?它应该只是作为一个分支永远坐在那里直到时间结束,还是我们现在应该删除它,因为它已经达到了它的目的?因为分支列表可能会变得非常长,而且大部分分支甚至都不再需要了,所以看起来不干净就只是让分支到处都是。

如果它应该被删除,它的历史将会发生什么?即使实际的分支不再可用,这是否会得到维护?另外,我如何删除远程分支?

8 个答案:

答案 0 :(得分:159)

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

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

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

答案 1 :(得分:46)

您需要做的是标记您发布的任何内容。在积极开发时保持分支。

使用

删除旧分支
git branch -d branch_name

使用

从服务器中删除它们
git push origin --delete branch_name

或旧语法

git push origin :branch_name

,其内容为“在原点将任何内容推送到branch_name”。

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

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

答案 2 :(得分:28)

由于问题有“github”标记,我还要添加:特别是Github,如果你 pull-request 一个分支并且它被合并(或者通过UI或合并拉取请求的分支),即使删除了分支,也不会丢失拉取请求数据(包括注释),

这样做的结果是:如果您将拉取请求作为工作流程的一部分(与代码审查完美融合),您可以在合并后立即删除分支。这是非常普遍的,最近Github添加了一个(甜蜜的)功能,在合并拉取请求后立即弹出“删除分支”按钮。

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

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

答案 3 :(得分:6)

我想补充一点,删除分支的缺点是你会破坏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 :(得分:3)

您似乎想删除2011_Hotfix分支而不会丢失其历史记录。我将先讨论删除和历史第二。

上面已经描述了通常的git分支删除方法,它们按预期工作。 git没有一个或两个单词命令,意思是“嘿git,删除本地和远程分支。”但是这种行为可以通过shell脚本来模仿。例如,取Zach Holman's shell script '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的提交历史记录中。简而言之,您不会从简单的合并中丢失历史。

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

您可以删除所有主要网页用户界面中的分支,例如github,BitBucket。在线删除分支后,您可以使用

删除本地分支
git remote prune origin

答案 7 :(得分:0)

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

paintEvent()