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

明天,有人报告了一个很大的错误,我们决定立即将其放置。因此,我们创建了一个由“主”命名为“ 2011_hotfix”的热点的分支,然后将其推开,以便所有开发人员都可以合作解决它。

我们将错误修复,然后将“ 2011_hotfix”合并到“主”中以及当前的开发分支中。并推动“主人”。

我们现在如何处理“ 2011_hotfix”?它应该永远坐在那里,直到时间结束,还是现在应该将其删除,因为它已经达到了目的?似乎只剩下各处的分支机构,因为分支机构的清单可能会变得很长,其中大部分甚至不再需要。

如果应该删除它,其历史将会发生什么?即使实际分支不再可用,也会维持这种情况吗?另外,如何删除远程分支?

有帮助吗?

解决方案

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

因此,删除合并的分支很便宜,不会让您失去任何历史。

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

其他提示

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

删除旧分支

git branch -d branch_name

使用

git push origin --delete branch_name

或旧语法

git push origin :branch_name

它读为“在原点上什么都不推入branch_name”。

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

Google的“ Git-Flow”,这可能会给发布管理,分支和标记提供更多了解。

由于问题具有“ github”标签,我也会添加此:特别是 github, , 如果你 拉力重quest 分支并合并(通过UI或通过合并拉请求的分支),您不会丢失拉请请求数据(包括评论), 即使您删除了分支.

结果是:如果将拉力请求纳入工作流程的一部分(与代码评论一起融合在一起),则可以在合并后立即安全地删除它们。这是如此普遍,最近GitHub添加了一个(甜)功能,该功能在合并拉动请求后立即弹出“删除分支”按钮。

但是,值得注意的是,每个小组都应采用最适合它的工作流程(并且可能会或可能不会导致删除此类分支)。例如,我目前的工作团队将一旦合并后,就会修剪所有与主人或部署相关的分支机构(例如,生产,分期等)每种产品的每个增量改进。

当然,没有历史管理(拉动请求或其他方式)代替了版本的正确标记(最好使用该版本的相同工具/脚本自动化版本),因此您始终可以快速切换任何用户,在给定的时刻。标记也是解决您的原始问题的关键:如果您确定任何分支合并到“工作”分支机构可以并且应该被删除,并且任何合并到版本标签的人,则“生产”等。 ,您将始终将其存放到未来版本中,直到将其集成到未来版本中为止。

我要补充说,删除分支的缺点是,您将在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

看来您想删除 2011_Hotfix 分支而不会失去其历史。我将首先讨论删除和历史记录。

通常 git 分支删除方法已经在上面描述,它们按预期工作。 git 没有一个或两个单词命令,意思是:“嘿 git, ,删除本地和远程分支。”但是可以通过shell脚本模仿此行为。例如,以 扎克·霍尔曼(Zach Holman)的壳牌剧本“ 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的历史。

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

您可以在所有主要网络UI中删除分支,例如GitHub,Bitbucket。在线删除分支后,您可以使用

git remote prune origin

如果您想修剪已从原点删除的本地分支机构,则可以在使用时修剪 git fetch

git fetch --prune
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top