Когда именно git удаляет объекты: почему «git gc» не удаляет коммиты?

Я работаю над git курсом и хотел бы упомянуть, что потерянные реферы действительно не теряются до запуска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 коммитов. Непосредственно перед сбросом он напечатает хеш текущего заголовка.

я мог быожидать потерять объект вCURRENT после запускаgit gc --prune=all, Тем не менее, я все еще могу бежатьgit show на этот хэш.

Я понимаю, что после запускаgit reset и добавив новые коммиты, я по сути создал новую ветку. Но моя оригинальная ветка больше не имеет ссылки, поэтому она не отображается вgit log --all, Полагаю, он также не будет перенесен на любой пульт.

Мое пониманиеgit gc было то, что удаляет эти объекты. Это не похоже на случай.

Зачем? А такжекогда точнееgit gc удалить объекты?

Ответы на вопрос(1)

Ваш ответ на вопрос