Git分支删除

84
在Git中,“删除”一个分支意味着什么?
它会从存储库中消失吗?还是可以通过 git branch 导航到它?
我真正想要做的是将一个分支标记为“死胡同”,即该分支距离主干太远,没人应该将其用作起点,尽管在该分支上有一些好的想法,因此我们希望保留它以供参考。
4个回答

163

您可以删除分支,但是请先为其打上标签,以防其历史记录消失。这样,该分支将不会在分支列表中显示,这应该能够阻止人们对其进行工作,但该工作不会被永久删除(即使垃圾回收运行后)。例如,每当我有一个已经变得不相关的分支,但我还没有准备永久删除它时,我会将其标记为 "archive/<branch-name>"。

master 或其他某个分支上执行:

git tag archive/foo foo
git branch -D foo

这将从foo分支创建名为archive/foo的标签,然后再删除foo。您还可以添加一条消息到标签中,解释该分支中存在着什么内容,为什么它存在以及为什么现在已经是一个死胡同等等。

git tag -m 'Foo is deprecated in favor of bar' archive/foo foo

使用标签记录分支被弃用的原因,可能是标记与将分支移动到备用命名空间相比的优势。

如果您需要恢复以此方式进行存档的分支,只需执行以下简单操作:

git branch foo archive/foo
git tag -d archive/foo       # Optional

现在这个分支已经回到了好像它从未被删除过一样。


5
这个方法也适用于远程仓库,通过推送存档标签(使用git push命令的--tags选项),然后删除远程分支(在推送时使用 :<branch-to-delete> refspec)。例如:git tag archive/foo foo; git branch -D foo; git push --tags origin :foo - Dan Moulding
如果git有自动通知人们“此分支已归档”并显示提交信息的方式,那就太好了,如果有人尝试从归档分支拉取代码时会收到这个通知,但事实并非如此。 - Robin Green
1
非常好的答案,正是我在寻找的!只是为了确认一下,在分支被合并回主分支之前被删除,这个方法还有用吗? - claf
另一个相关的问题(如果有人仍在关注这个线程)是,如果有多个开发人员参与了这个分支,我应该如何“关闭”(合并到主分支或存档到标签或其他方式)?删除和标记分支(本地和远程)对于这个分支的其他开发人员来说是否太粗鲁了? - claf
1
这个答案很棒,是个绝妙的解决方案。 - Christopher Thomas

3

Git分支被存储为对某个版本的引用。如果您删除了分支,则该引用将被删除;如果没有其他内容引用该版本,则它最终将被垃圾回收。此外,如果您删除了分支,则它将从您的代码库中彻底删除。如果您想将一个分支标记为已弃用但仍然保留以备后用,则可以将该分支移动到子目录中:

$ git branch
* master
  testing_feature_one
  testing_feature_two
$ git branch -m testing_feature_one deprecated/testing_feature_one
$ git branch
  deprecated/testing_feature_one
* master
  testing_feature_two

另外,您可以为弃用的分支创建单独的存储库,将它们拉取过来,然后从原存储库中删除。无论哪种情况,都会影响跟随这些分支的任何用户--他们的存储库内容不会更改(也不会更改任何分支名称),但是如果他们再次尝试拉取,则必须在其配置中更改目标。


3

git branch -D <branchName>会从仓库中删除你的分支。你将不能再看到或导航到它。此外,你将失去在该分支中所做的所有文件更改。

https://git-scm.com/docs/git-branch


0

它不会通过git分支进行导航,直到垃圾回收执行之前,它才不会从存储库中丢失。

如果您想将相关的分支标记为死胡同,那么只需这样做(git可能不会为您执行此操作,但您肯定可以)!

将其(以任何您喜欢的方式)标记为历史参考即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接