我有以下git分支:master和dev:
*master*
|
A--B--C
\--D--E
|
*dev*
在重新设计主人的开发后,我有:
*master*
|
A--B--C--D'--E'
\--D--E |
|
*dev*
所以D和E仍然处于“死分支”。我该如何删除它们?
答案 0 :(得分:6)
您不需要:因为提交D
和E
没有指向他们的 1 名称,他们就有资格获得&#34 ;垃圾收集"。最终git将运行git gc
并将它们丢弃。
如果你想加快速度,你可以自己运行git gc
,但脚注1会发挥作用。 : - )
1 这不完全正确。虽然分支名称dev
现在包含提交E'
的ID(副本),但有两个reflog条目,一个用于dev
,一个用于HEAD
,允许你(和git)找到提交E
。还有一个半特殊名称ORIG_HEAD
,持续到其他内容替换其内容(例如另一个rebase或git merge
)。
默认情况下,大多数reflog条目会持续30天或90天,具体取决于是否可以从当前分支头部访问提交。一旦reflog条目到期,然后该对象就是垃圾收集的候选者。
作为另一项预防措施,git gc
离开"松散的物体"除非他们至少有两周的时间(默认情况下 - 这是可配置的,并且还有一个--prune=
选项来覆盖它)。所以一般来说,对于一个名义上被遗弃的物体,它会消失:
(当然,git gc
必须运行,尽管git会自动运行,只要它看起来很有希望"。)
答案 1 :(得分:0)
如果您有额外的提交,那么没有什么会破坏,它们就在那里,以防您想要在您的reflog周围移动或以后再引用它们。
但是,如果要强制删除额外的提交和其他不必要的对象,可以使用git gc
。如果您希望删除尽可能多的额外提交/对象(并且您不关心速度),则可以使用git gc --aggressive
。
注意:从技术上讲,D和E不再在分支中。分支只是提交的指针,它们没有自己的历史(除了它们指向的特定提交的历史)。因此,当您重新设置dev时,git会离开D和E提交,以防您以后想要访问它们,即使它们不再位于分支上。