了解Java的同学应该听过GC这个词 ➡ garbage clean,没错清理垃圾对象~
首先我们先确定下在git中,垃圾对象是怎么产生的?
主要有两个途径:
-
由于多余的add
-
已删除的分支
那么,git gc真的是像Java一样把git中产生的垃圾对象清除掉了吗---·?
下面用一个测试来瞅下
(嘿嘿》〉着急看结论的同学可以直接滑到文末~)
-
新建一个名为aqin-branch(名字自己随意~)的分支
-
git checkout -b aqin-branch
-
-
新建一个文本文件aqin.txt
-
echo "da">aqin.txt
-
-
将文件添加进索引区
-
git add aqin.txt
-
-
对文档进行修改,再次添加索引区
-
echo "heheheda">aqin.txt git add aqin.txt
-
此时的3b2b1a对象其实就是一个垃圾对象(其实就是没用的对象),因为aqin.txt这个文件在后commit前已经被修改过并再次add了,是不会被commit的,我们只会直接commit后面最新修改过的对象
-
提交到本地仓库
-
git commit -m "test"
-
新增的这两个对象分别是tree和commit
-
删除新建分支(测试删除分支不会删掉只在该分支的commit过的对象)
-
直接删除会报错
-
报错原因:⚠️无法删除当前正处于的分支,如删除当前分支则需要先换到别的分支上(如master,就像你不能拆掉你现在站的那层楼梯,只能先下一层或者上一层)
-
新建一个分支test,然后切换到新分支后再次删除分支aqin-branch
-
而此时,objects文件夹下的内容并未发生变化
-
故➡️删除分支不会删掉只在该分支的commit过的对象
-
使用git gc的效果
-
再次查看objects文件夹
-
变化:
-
之前4个对象变成了一个对象(这个对象就是第一次add后生成的那个3b2b1a,即垃圾对象)
-
pack文件夹里新增加了2个文件(一个.idx索引文件,一个pack压缩文件)
-
-
总结:
-
通过git gc无法把垃圾对象删除掉,只会把有用的对象pack进pack文件夹
-
-
🎉🎉🎉~
-·-·-> 下篇记录如何真正删除垃圾对象哈~