Git存储库中的悬垂提交和blob是什么?它们来自哪里?

我正在寻找关于悬空提交和blob的基本信息。

我的存储库看起来很好。但是我第一次运行git fsck来看看它做了什么,我有一个长长的“悬垂blobs”列表和一个“悬垂commit”。

这些是什么东西?他们从哪里来?它们是否表明关于存储库状态的任何异常(好或坏)?

99089 次浏览

在使用Git存储库的过程中,您最终可能会退出操作,并做出其他会导致中间blobs的操作,甚至Git为您做的一些帮助避免信息丢失的事情。

最终(根据Git gc手册,有条件的)它将执行垃圾收集并清理这些东西。你也可以通过调用垃圾收集进程git gc来强制它。

有关这方面的更多信息,请参阅git-scm网站上的维护和数据恢复

缺省情况下,手动运行GC将在此命令运行前两周作为安全网。实际上,鼓励偶尔运行GC,以帮助确保Git存储库的性能使用。不过,像任何事情一样,在破坏那些对你可能很重要的东西之前,你应该了解它在做什么。

晃来晃去的团 =对暂存区/索引的更改,但从未提交。Git的一个惊人之处在于,一旦它被添加到staging区域,你总是可以把它拿回来,因为这些blobs的行为就像提交一样,因为它们也有一个哈希!!

晃来晃去的承诺 =没有被任何子提交、分支、标签或其他引用直接链接的提交。你也可以把这些拿回来!

如何从你的Git仓库中删除所有悬空提交 http://www.tekkie.ro/news/howto-remove-all-dangling-commits-from-your-git-repository/ < / em >:

git reflog expire --expire=now --all
git gc --prune=now

确保您真的想要删除它们,因为您可能最终决定需要它们。

悬空提交是一种不与引用关联的提交,也就是说,没有办法到达它。

例如,考虑下面的图表。假设我们删除了分支featureX而没有合并它的更改,那么提交D将成为悬空提交,因为没有与它相关的引用。如果它被合并到master中,那么HEAD和master引用就会指向提交D,即使我们删除了featureX,它也不会再悬着了。阅读图表后面的说明以更好地理解这一点。

Git自动垃圾收集,即处理悬空提交。我们可以使用git reflog来恢复(悬空提交的)被删除而没有合并的分支。只有当被删除的提交存在于本地对象存储中时,我们才能恢复它。如果是垃圾收集,我们就无法回收。

enter image description here

请注意指出分支名称,即分支标签实际上是对分支或分支顶端上的最新提交的引用。在上图中,featureX、master和HEAD只是对特定提交的引用。featureX和master标签指的是它们各自分支上的最新提交。HEAD通常指当前签出分支(在本例中为master)的顶端。如果您签出当前分支上的旧提交,那么HEAD将处于分离状态,也就是说,它将指向旧的提交而不是最新的提交。还要注意,HEAD之所以被称为符号引用,是因为它实际上指向当前分支标签,而任何分支标签总是指向分支的顶端。因此,在正常情况下,HEAD间接指向最近的提交。

顺便说一句,请注意Git将其提交图/历史表示为有向无环图。每个提交都有一个对其父文件的引用。因此,提交图中的箭头从子提交指向父提交。我们需要引用最新的子提交,以便到达分支上较旧的提交。

PS -上面的图表和理解是从这个免费的课程。虽然这门课很古老,但所学的知识仍然是相关的。

如果“修改”提交,也会出现悬垂提交。例如,您做了大量工作,测试并提交了所有文件,然后记得忘记更新README文件。所以你可以快速地修改它,添加它,然后使用“git commit—amend”。这将创建一个新的提交,该提交链接到提交的历史记录中,而原始提交将保持悬空状态。