Что случилось с коммитом, который не отображается ни в одной ветке, но доступен в "git show"

У меня есть идентификатор коммита, доступный в голом репо.
git show commit id, показывает коммит с изменениями.

Но тот же коммит не отображается при использовании следующих команд

git branch --contains <commit id>

или же

git reflog show --all | grep <commit id>

Что могло случиться с идентификатором коммита?

3 ответа

Можно создать ветку, зафиксировать ее и затем принудительно удалить ее git branch -D, В этом случае коммиты теряются таким образом. Reflog показывает журналы существующих ссылок.

Кроме того, ваши команды не проверяют reflog заголовка. Пытаться git reflog show HEAD, он может содержать коммит (например, если он был превращен в отдельную головку), если он еще не собран мусором.

(Извините за мой предыдущий ответ, полностью не по теме).

git reflog не будет проходить каждый коммит, если вы git pull или же git clone на удаленном, так что, возможно, этот коммит происходит от одной из этих операций.

Кроме того, я полагаю, что вы проверили, что коммиту менее 90 дней, хотя он мог бы быть установлен иначе с настройками gc по умолчанию.

Я считаю, что эти коммиты называются висячими коммитами. git fsck покажет им. Они все еще существуют в Git-хранилище до git gc или же git prune пробеги. В общем-то, git gc автоматически запустится, когда в репо окажется слишком много потерянных объектов, которые будут упакованы в файл пакета. git gc операция также удалит фиксированные коммиты до определенного времени. git gc --prune=now а также git prune --expire=now удалит эти коммиты немедленно. git config --global gc.auto 0 отключит автоматический запуск gc.

Другие вопросы по тегам