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