强制删除HEAD之前的所有提交?

时间:2014-10-28 16:04:33

标签: git

我之前在我的git repo中弄得一团糟,做了合并并添加了标签之类的东西。我现在将我的开发分支重置为我想要的提交(粗体的那个),但是在提交之前的历史中仍然有一堆提交:

enter image description here

如何摆脱这些提交(从分支首次分散在487ff69处开始),好像它们从未发生过一样?这不一定需要在SourceTree中发生 - 终端命令也可以。

谢谢!

1 个答案:

答案 0 :(得分:2)

Git非常努力地从未删除提交(我们可以忽略一些例外)。我认为你想要的是让这些提交无法访问,这更容易,因为引用 - 主要是分支和标记名称(像git' s&#34这样的东西) ; stash"也是引用,但我们可以忽略这里) - 是什么使提交可达。

因此,为了使提交不可达,我们只需移动或删除引用。

您的develop已经移动了:它现在指向粗体提交,就像您想要的那样。大概你做了一个git reset或GUI等效的实现。现在,通过您添加的代码0.1.30.1.20.1.1仅对 1 引用了不需要的提交。

因此,您需要做的就是删除标记(或停止使用它们),并且提交将(似乎)消失。 (根据其他细节,他们仍会坚持一段时间,默认为30到90天,但如果没有"命名"参考,他们将在此之后消失;另请参阅脚注此处。)


1 通过git" reflog"对这些提交有一个侧面参考,或者不止一个。每当git更新引用时,例如像develop这样的分支名称,甚至是间接的"当前的树头#34;引用名为HEAD,它更新该引用的reflog(如果reflog存在)。这些reflog条目用于保护提交:每个条目都有一个时间戳和一个原始SHA-1值,这些用作保留提交(或标记,如果它们指向带注释的标记)的引用。对提交的任何引用都将保留它,然后如果它有自己对父提交的引用,则该提交将保留其父提交,依此类推。这就是让git像Borg一样坚持保存存储库中任何东西的原因。