Git:什么是悬空提交/ blob,它们来自哪里?

时间:2013-08-29 15:08:50

标签: git git-commit git-fsck git-dangling

我正在寻找有关悬挂提交的基本信息。斑点。

我的回购似乎很好。但是我第一次跑git fsck看看它做了什么,我有一长串'悬空blob'和一个'悬挂提交'。

这些东西是什么?哪儿来的?他们是否表明我的回购状态有什么异常(好或坏)?

5 个答案:

答案 0 :(得分:81)

悬空blob =进入暂存区/索引但从未提交的更改。 git的一个令人惊奇的事情是,一旦它被添加到临时区域,你总是可以将它恢复,因为这些blob的行为类似于提交,因为它们也有哈希!!

悬空提交 =未通过任何子提交,分支,标记或其他引用直接链接的提交。你也可以回来了!

答案 1 :(得分:78)

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

最终(有条件地,根据git gc man page),它将执行垃圾收集并清理这些内容。您也可以通过调用垃圾收集过程git gc来强制它。

有关此内容的详细信息,请参阅git-scm网站上的Maintenance and Data Recover

默认情况下,手动运行GC将在安全网的此命令运行之前2周离开。实际上鼓励偶尔运行GC以帮助确保高效使用您的git存储库。但是,就像任何事情一样,你应该在破坏那些可能对你很重要的事情之前理解它在做什么。

答案 2 :(得分:30)

HOWTO从您的git存储库中删除所有悬空提交 http://www.tekkie.ro/news/howto-remove-all-dangling-commits-from-your-git-repository/

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

确保你真的想要删除它们,因为你可能认为你毕竟需要它们。

答案 3 :(得分:6)

悬空提交是与引用不相关的提交,即无法达到引用。

例如,考虑下图。假设我们删除分支FeatureX而不合并其更改,则提交D将变为悬空提交,因为没有与之关联的引用。如果将它合并到master中,那么HEAD和master引用将指向提交D,即使我们删除了featureX,它也不再悬而未决。阅读图表后的注释可更好地理解这一点。

Git自动垃圾收集(即处理)悬空的提交。我们可以使用git reflog来恢复分支(悬挂提交),该分支在不合并的情况下被删除。只有本地对象存储中存在已删除的提交,我们才能恢复已删除的提交。如果是垃圾收集,那么我们将无法恢复。

enter image description here

注意,分支名称(即分支标签)实际上是对分支上最新提交(即分支的尖端)的引用。在上图中,featureX,master和HEAD只是对特定提交的引用。 FeatureX和主标签引用各自分支上的最新提交。 HEAD通常是指当前已签出分支(在这种情况下为master)的尖端。如果您在当前分支上签出较旧的提交,则HEAD将处于分离状态,即它将指向较早的提交而不是最新的提交。还要注意,HEAD之所以称为符号引用,是因为它实际上指向当前分支标签,并且任何分支标签始终指向该分支的尖端。因此,在正常情况下,HEAD会间接指向最新提交。

顺便说一句,请注意,Git将其提交图/历史表示为directed acyclic graph。每个提交都有对其父对象的引用。因此,提交图中的箭头从子提交指向父提交。我们需要引用最新的子提交,才能在分支上到达较早的提交。

PS -上面的图表和理解是从此free course获得的。即使课程很老,但知识仍然有用。

答案 4 :(得分:0)

如果您“修改”提交,也会出现悬空提交。例如你做了很多工作,测试它并提交所有文件,然后记住你忘记更新自述文件。所以你快速改变它,添加它,然后使用“git commit --amend”。这会创建一个链接到提交历史的新提交,而原始提交则悬而未决。