我正在学习 git 课程,想提一下丢失的 refs 直到 running 才真正丢失git gc
。但是验证了这一点,我发现事实并非如此。即使在运行git gc --prune=all --aggressive
丢失的裁判之后仍然存在。
显然我误解了一些东西。在课程中说错话之前,我想弄清楚我的事实!下面是一个示例脚本来说明效果:
#!/bin/bash
git init
# add 10 dummy commits
for i in {1..10}; do
date > foo.txt
git add foo.txt
git commit -m "bump" foo.txt
sleep 1
done;
CURRENT=$(git rev-parse HEAD)
echo HEAD before reset: ${CURRENT}
# rewind
git reset --hard HEAD~5
# add another 10 commits
for i in {1..10}; do
date > foo.txt
git add foo.txt
git commit -m "bump" foo.txt
sleep 1
done;
该脚本将添加 10 个虚拟提交,重置为过去的 5 个提交,然后再添加 10 个提交。就在重置之前,它将打印当前 HEAD 的哈希值。
我希望CURRENT
在运行后丢失对象git gc --prune=all
。然而,我仍然可以git show
在那个哈希上运行。
我确实明白,在运行git reset
并添加新提交之后,我基本上创建了一个新分支。但我原来的分支不再有任何引用,所以它没有出现在git log --all
. 我想它也不会被推送到任何遥控器。
我的理解git gc
是删除那些对象。情况似乎并非如此。
为什么?什么时候git gc
删除对象?