关闭分支而不是合并?

时间:2014-04-17 20:02:31

标签: git

是否可以“关闭”分支而不是合并它,或“合并”它而不向我合并的分支添加任何更改。

基本上,很久以前我做了一个分支做某事,然后忘了它。最近,我想将该功能添加回主服务器,但是代码已经发生了很大的变化,并且很多文件已经从主服务器中删除了仍然在这个分支中,合并它只会添加一堆垃圾到大师。所以我手动将这些东西添加到我的主分支中,逐行进行。反正有没有结束我现在不再需要的分支,还是注定永远陷入困境?

2 个答案:

答案 0 :(得分:4)

与许多(大多数?)版本控制系统不同,在git中,分支实际上并不是存储库的一部分。 1 分支只是标签 - 它们只是有点特殊 2 因为它们是"自动移动标签"。这意味着什么都没有"关闭",不像(比如说)Mercurial,其中提交带有它们的分支,因此分支真正存储库的一部分,并且那里有#sa; "关闭"每个分支的位。

为了达到你想要的效果,我们首先必须定义你想要的东西。

那么,你想要的做什么呢?让我们回到问题描述:

  很久以前我做了一个分支做某事,然后忘记了。最近,我想添加该功能[但复制功能部分比使用git merge更有意义。

因此,让我们绘制提交图或其简化版(有趣的是,有多少git事情从#34开始;好吧,让我们绘制图表" )。这是你开始之前所拥有的东西"添加该功能"序列:

...-o-o-...-o-o-o-o   <-- master
     \
      F1-F2-F3   <-- long-ago-feature

三个F提交是旧功能。您现在已经将这三个复制({#1}}复制(&#34;樱桃挑选&#34;,除了每个描述,您手动完成)。让我们用小写字母绘制它们,因为它很难做到颜色,我也会假设它们现在只是一次提交,而不是它非常重要:&lt; < / p>

master

现在你想&#34;关闭&#34; ...-o-o-...-o-o-o-o-f123 <-- master \ F1-F2-F3 <-- long-ago-feature 分支。但这是什么意思呢?

  • 让我们在这里有一个侧边栏。在git中,branch-name为您做两件事:它允许您按名称引用特定的提交,例如long-ago-feature。 (然后F3是指F3的内容,依此类推。)但分支名称​​也可让您查看&#34; 分支,而不仅仅是&#34;签出&#34;特定的提交; F2操作会将您&#34;放在分支foo&#34;上,之后git checkout foo会说git status。这就是特殊功能的用武之地。如果你在分支foo上,并且使用on branch foo进行新的提交,git会进行新的提交,然后更改分支标签{{1指向新提交。新提交指向旧分支。这真的是什么使得分支机构和#34;分支机构&#34;。他们做的其他事情,你可以用任何旧的参考名称;但只有分支参考自动&#34;前进&#34;像这样。

    请注意,即使使用分支名称,git也允许您执行git commit,它会检查提交但是会将#34; off branch&#34;转换为&#34;分离的HEAD&#34;州。在这种情况下,添加新提交更新任何分支,因为没有要更新的分支。 (相反,它会直接更新特殊foo引用。这些添加的提交没有其他标签,因此除非您稍后添加,否则它们会被放弃 - 请参阅下面的说明 - 一旦您进入其他分支。)

您可以将其删除为raina77ow proposed。这样做只需删除标签:

git checkout --detach foo

三个旧的提交被放弃了,最终(大约一个月)将被垃圾收集,之后它们将真正消失。但那并不是你想要的:

  

我仍然喜欢&#34;保持&#34; [分支]供将来参考。只是不作为[一个分支,或至少一个&#34;开放&#34;分支,无论真正意味着什么]。

在这种情况下,你可以把它留在那里,但它看起来就像任何其他分支 - 显然不是你想要的,或者你不会问关闭分支。< / p>

您只需重命名即可。例如,您可以拥有您已命名为HEAD...-o-o-...-o-o-o-o-f123 <-- master \ F1-F2-F3 [abandoned - no label] 的普通分支,告诉您自己只是保存它们以供参考,而不是添加到:

dead

这只是重命名标签。它仍然是一个分支,它只有一个以closed开头的名称,您可以将其用作提醒。

但是,您可能反对将其保留为分支,因为分支是特殊的&#34;,因为如果添加更多提交,标签会移动。您希望确保不添加更多提交。在这种情况下,您可以更改标签的类型。例如,将其标记为:

git branch -m long-ago-feature dead/long-ago-feature

现在,标记dead/指向提交git tag dead/long-ago-feature long-ago-feature git branch -D long-ago-feature ,标记是标记,而不是分支。如果您通过标签名称进行检查,那么您将进入&#34;分离的HEAD&#34;模式,而不是分支。

您可能也不喜欢这样:可能是标签会使标签名称空间混乱,而且太容易推送到远程(F3推送所有您的标签)。在这种情况下,您可以使用不在三个标准&#34;分支和标记&#34;中的任何一个的引用。名称空间,与任何当前或未来的 3 名称空间:

相同
dead/long-ago-feature

现在提交git push remote --tags被标记,因此它不会消失,但标签不是分支,不是标签,甚至也不是远程分支。要按名称命名提交git update-ref refs/deadheads/long-ago-feature long-ago-feature git branch -D long-ago-feature ,您必须拼出长引用形式(请参阅gitrevisions documentation)。


1 嗯,这确实是一个定义问题。但分支不会记录为存储库对象。分支只是一种特殊的参考形式,其他两种标准的特殊但通用的形式是标签和#34;远程分支&#34;。通常,引用是以F3开头的名称;分支是以F3开头的分支。标签以refs/开头,远程分支以refs/heads/开头。对于(单个)隐藏参考,还有refs/tags/,对于refs/remotes/,名称空间以refs/stash开头。在任何情况下,这些都不是存储库对象。它们只是名称,看起来像目录结构的名称空间,存储在refs/notes/的目录中,或者git notes中的平面文件。

2 事实上,&#34;自动移动&#34;使他们非常很多特别,并且可能是&#34;关闭&#34;的全部动机。或者可能不是。让我们来看看吧! : - )

3 正如Niels Bohr和/或Yogi Berra所说,很难做出预测,特别是关于未来的预测。您选择的任何名称空间有一天都可以使用,但至少.git/refs/是暗示性的。 (虽然可能是杰瑞加西亚的追随者。)

答案 1 :(得分:3)

只需将其删除 - 本地:

git branch -D branch_name

(它是-D,因为&#39;软表格&#39; - -d - 不允许您删除未合并的分支)

......远程:

git push origin :branch_name