Git:什么是悬空的提交/ blob,它们来自何处?


148

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

我的仓库似乎很好。但是我git fsck第一次跑去看看它做了什么,我有一长串的“悬挂斑点”和一个“悬挂提交”。

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

Answers:


95

在使用git存储库的过程中,您可能最终会退出操作,并做出其他导致中介blob的动作,甚至git为您做的某些事情也有助于避免信息丢失。

最终(有条件地,根据git gc手册页),它将执行垃圾回收并清理这些东西。您也可以通过调用垃圾回收过程来强制执行此操作git gc

有关此的更多信息,请参见git-scm站点上的维护和数据恢复

默认情况下,手动运行GC将在安全网此命令运行之前2周离开。实际上,建议您偶尔运行GC,以确保高效地使用git存储库。但是,像其他任何事情一样,在破坏那些可能对您很重要的事情之前,您应该了解它的作用。


10
因此,可以这样说:1)除非我认为我的仓库有问题,否则可以安全地将其删除git gc,2)我完全不必担心,因为这些悬空的位是正常的并且已经是git处理的吗?
doub1ejack

7
那将是一个公平的评估。
vgoff

9
另外,每当您“ git添加”文件但不提交该文件的确切版本时,最终都会出现悬空的Blob。不用担心。
canton7

7
doub1ejack-一般来说,您不应该手动运行垃圾收集。进入它是一个坏习惯,无论如何需要git进行垃圾收集。手动运行它的缺点是,您失去了恢复悬挂的Blob的能力,并且犯下了现在可能不想要但将来可能想要的承诺。一旦运行了垃圾回收,您就会从git中删除一些非常强大的还原功能。请谨慎使用,并作为例外,而不是常规。---让git做它的事情。
伊利亚·林恩

95

悬空斑点 =更改到暂存区/索引但从未提交的更改。git令人惊奇的一件事是,一旦将其添加到暂存区中,您就可以随时将其取回,因为这些blob的行为就像是提交,因为它们也具有哈希!

悬挂提交 =未与任何子提交,分支,标签或其他引用直接链接的提交。您也可以找回这些!


5
“祖先”应该读为“后裔”吗?通常,您无法通过其祖先达到任何git commit。
Phil Miller

@Novelocrat我也有同样的想法,我同意应该读后代。
stkent 2015年

1
我仍然在您的答案中读到“上升”。您的7月2日发行的版本似乎没有改正错别字。
iclman 2015年

您如何找回悬挂的斑点?
HelloGoodbye

1
@ElijahLynn你是对的。我想我读的讨论太快了。悬空的提交没有任何后代/子代,并且没有被标签或分支引用。
iclman

44

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

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

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


5
实际上,大多数用户永远都不需要它,如果这样做,可能是出于编程用例。在我看来,通过删除悬空的提交来节省磁盘空间或提高速度的做法是不值得的。
伊利亚·林恩

1
这回答了一个不同的问题。
伊利亚·林恩

5

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

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

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

在此处输入图片说明

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

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

PS-以上图表和理解是从此免费课程中获得的。即使课程很老,但知识仍然很重要。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.