311

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

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

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

我们现在如何处理“2011_Hotfix”?它应该永远作为一个分支一直存在直到时间结束,还是我们现在应该删除它,因为它已经达到了它的目的?把树枝到处乱放似乎是不干净的,因为树枝的列表可能会变得很长,其中大部分甚至不再需要了。

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

4

8 回答 8

201

You can safely remove a branch with git branch -d yourbranch. If it contains unmerged changes (ie, you would lose commits by deleting the branch), git will tell you and won't delete it.

So, deleting a merged branch is cheap and won't make you lose any history.

To delete a remote branch, use git push origin :mybranch, assuming your remote name is origin and the remote branch you want do delete is named mybranch.

于 2011-03-16T18:45:21.630 回答
62

您需要做的是标记您发布的任何内容。当您积极开发时,请保留分支。

删除旧分支

git branch -d branch_name

从服务器中删除它们

git push origin --delete branch_name

或旧语法

git push origin :branch_name

读作“在原点处不向 branch_name 推送任何内容”。

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

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

于 2011-03-16T21:22:45.147 回答
33

由于问题有“github”标签,我还要添加这个:特别是在Github中,如果你拉请求一个分支并且它被合并(通过 UI 或通过合并拉请求的分支),你不会即使您删除了分支,也会丢失拉取请求数据(包括评论)。

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

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

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

于 2012-12-07T05:12:35.573 回答
8

我要补充一点,删除分支的缺点是你会破坏 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
于 2013-03-23T18:43:01.440 回答
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_Hotfixmaster后,来自的所有提交2011_Hotfix都将添加到master的提交历史记录中。简而言之,您不会因为简单的合并而丢失历史记录。

我还有一句话要补充,这可能超出了您的问题范围,但仍然相关。让我们假设有 20 个微小的“正在进行中”的提交2011_Hotfix;但是,您只希望将一个完整的提交2011_Hotfix添加到master的历史记录中。如何将所有 20 个小提交合并为一个大提交?幸运的是,git允许您使用git-rebase. 我不会在这里解释它是如何工作的。但是,如果您有兴趣,文档git-rebase非常好。请注意,git rebase它会改写历史,所以应该明智地使用它,特别是如果你是新手。最后,你的2011_Hotfix场景是关于一个开发团队,而不是一个单独的开发者。如果项目团队成员使用git rebase,对于团队来说,明确的使用指南是明智的,这样团队中的git rebase一些牛仔开发人员不会无意中破坏项目的git历史。

于 2015-06-28T17:48:52.383 回答
3

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

于 2011-03-16T18:52:16.483 回答
2

如果要修剪已经从 origin 中移除的本地分支,也可以修剪,同时使用git fetch

git fetch --prune
于 2018-10-18T07:00:25.233 回答
0

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

git remote prune origin
于 2017-12-06T05:17:52.160 回答