我正在寻找关于悬空提交和blob的基本信息。
我的存储库看起来很好。但是我第一次运行git fsck来看看它做了什么,我有一个长长的“悬垂blobs”列表和一个“悬垂commit”。
这些是什么东西?他们从哪里来?它们是否表明关于存储库状态的任何异常(好或坏)?
我正在寻找关于悬空提交和blob的基本信息。
我的存储库看起来很好。但是我第一次运行git fsck来看看它做了什么,我有一个长长的“悬垂blobs”列表和一个“悬垂commit”。
这些是什么东西?他们从哪里来?它们是否表明关于存储库状态的任何异常(好或坏)?
在使用Git存储库的过程中,您最终可能会退出操作,并做出其他会导致中间blobs的操作,甚至Git为您做的一些帮助避免信息丢失的事情。
最终(根据git gc手册页的说法,是有条件的)它将执行垃圾收集并清理这些东西。你也可以通过调用垃圾收集进程git gc来强制执行。
要了解更多信息,请参见git-scm站点上的维护和数据恢复。
缺省情况下,手动运行GC将在此命令运行前两周作为安全网。实际上,鼓励偶尔运行GC,以帮助确保Git存储库的性能使用。不过,像任何事情一样,在破坏那些对你可能很重要的东西之前,你应该了解它在做什么。
悬空blob =对暂存区/索引进行了更改,但从未提交。Git的一个惊人之处在于,一旦它被添加到staging区域,你总是可以把它拿回来,因为这些blobs的行为就像提交一样,因为它们也有一个哈希!!
悬空提交=没有被任何子提交、分支、标签或其他引用直接链接的提交。你也可以把这些拿回来!
如何从你的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
确保您真的想要删除它们,因为您可能最终决定需要它们。
悬空提交是一种不与引用关联的提交,也就是说,没有办法到达它。
例如,考虑下面的图表。假设我们删除了分支featureX而没有合并它的更改,那么提交D将成为悬空提交,因为没有与它相关的引用。如果它被合并到master中,那么HEAD和master引用就会指向提交D,即使我们删除了featureX,它也不会再悬着了。阅读图表后面的说明以更好地理解这一点。
Git自动垃圾收集,即处理悬空提交。我们可以使用git reflog来恢复(悬空提交的)被删除而没有合并的分支。只有当被删除的提交存在于本地对象存储中时,我们才能恢复它。如果是垃圾收集,我们就无法回收。
NOTE that a branch name i.e. a branch label is actually a reference to the latest commit on a branch or the tip of the branch. In the diagram above, featureX, master and HEAD are just references to specific commits. featureX and master labels refer to latest commits on their respective branches. HEAD generally refers to the tip of the currently checked out branch (master in this case). If you checkout an older commit on your current branch, then HEAD will be in a detached state, i.e., it will point to the older commit instead of the latest one. Also note that HEAD is called a symbolic reference because it actually points to the current branch label and any branch label always points to the tip of the branch. So, under normal circumstances, HEAD indirectly points to the latest commit.
顺便说一句,请注意Git将其提交图/历史表示为有向无循环图。每个提交都有一个对其父文件的引用。因此,提交图中的箭头从子提交指向父提交。我们需要引用最新的子提交,以便到达分支上较旧的提交。
PS -以上图表和理解都是从这个免费课程中获得的。虽然这门课很古老,但所学的知识仍然是相关的。
如果“修改”提交,也会出现悬垂提交。例如,您做了大量工作,测试并提交了所有文件,然后记得忘记更新README文件。所以你可以快速修改它,添加它,然后使用"git commit -amend"这将创建一个新的提交,该提交链接到提交的历史记录中,而原始提交将保持悬空状态。