git:在rebase之后删除死枝?

时间:2014-12-20 08:37:27

标签: git rebase

我有以下git分支:master和dev:

   *master*
      |
A--B--C
   \--D--E
         |
       *dev*

在重新设计主人的开发后,我有:

   *master*
      |
A--B--C--D'--E'
   \--D--E   |
             |
           *dev*

所以D和E仍然处于“死分支”。我该如何删除它们?

2 个答案:

答案 0 :(得分:6)

您不需要:因为提交DE没有指向他们的 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=选项来覆盖它)。所以一般来说,对于一个名义上被遗弃的物体,它会消失:

  • 必须至少两周;
  • 必须有任何reflog条目到期(通常为30天);和
  • 不得有任何替代名称,以保持其可用。

(当然,git gc必须运行,尽管git会自动运行,只要它看起来很有希望"。)

答案 1 :(得分:0)

如果您有额外的提交,那么没有什么会破坏,它们就在那里,以防您想要在您的reflog周围移动或以后再引用它们。

但是,如果要强制删除额外的提交和其他不必要的对象,可以使用git gc。如果您希望删除尽可能多的额外提交/对象(并且您不关心速度),则可以使用git gc --aggressive

注意:从技术上讲,D和E不再在分支中。分支只是提交的指针,它们没有自己的历史(除了它们指向的特定提交的历史)。因此,当您重新设置dev时,git会离开D和E提交,以防您以后想要访问它们,即使它们不再位于分支上。