Git: что такое свисающий коммит / блоб и откуда они берутся?

Я ищу основную информацию о висячих коммитах и ​​каплях.

Мой репо выглядит нормально. Но я побежал git fsck в первый раз, чтобы увидеть, что он сделал, и у меня есть длинный список "висячих шариков" и один "висячий коммит".

Что это за вещи? Откуда они пришли? Они указывают что-нибудь необычное (хорошее или плохое) о состоянии моего репо?

5 ответов

Решение

В ходе работы с вашим репозиторием git вы можете в конечном итоге отказаться от операций и предпринять другие шаги, которые вызывают промежуточные двоичные объекты, и даже некоторые вещи, которые git делает для вас, чтобы избежать потери информации.

В конце концов (условно, согласно странице руководства git gc) он выполнит сборку мусора и очистит все это. Вы также можете принудительно вызвать его, вызвав процесс сбора мусора, git gc,

Для получения дополнительной информации об этом см. Обслуживание и восстановление данных на сайте git-scm.

Ручной запуск GC по умолчанию уходит за 2 недели до времени выполнения этой команды защитной сети. Фактически рекомендуется периодически запускать GC, чтобы обеспечить эффективное использование вашего git-репозитория. Однако, как и все, вы должны понимать, что он делает, прежде чем разрушать те вещи, которые могут быть важны для вас.

Dangling blob = Изменения, которые сделали это в промежуточной области / индексе, но так и не были зафиксированы. Что удивительно в git, так это то, что как только он добавляется в область подготовки, вы всегда можете получить его обратно, потому что эти BLOB-объекты ведут себя как коммиты в том смысле, что у них тоже есть хэш!!

Висячий коммит = коммит, который напрямую не связан ни с одним дочерним коммитом, ветвью, тегом или другой ссылкой. Вы можете получить их тоже!

HOWTO удалить все висячие коммиты из вашего 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для восстановления ветки (зависших коммитов), которая была удалена без объединения. Мы можем восстановить удаленные коммиты, только если они есть в локальном хранилище объектов. Если он был собран сборщиком мусора, мы не сможем его восстановить.

ЗАМЕТЬТЕ, что имя ветки, то есть метка ветки, на самом деле является ссылкой на последнюю фиксацию в ветке, то есть вершину ветки. На диаграмме выше featureX, master и HEAD - это просто ссылки на определенные коммиты. featureX и мастер-метки относятся к последним коммитам в соответствующих ветках. HEAD обычно относится к вершине текущей проверенной ветки (в данном случае - master). Если вы проверяете более старую фиксацию в своей текущей ветке, то HEAD будет в отсоединенном состоянии, то есть будет указывать на более старую фиксацию вместо последней. Также обратите внимание, что HEAD называется символической ссылкой, потому что он фактически указывает на текущую метку ветки, а любая метка ветки всегда указывает на конец ветки. Итак, при нормальных обстоятельствах HEAD косвенно указывает на последний коммит.

Обратите внимание, что Git представляет свой график / историю фиксации как направленный ациклический граф. Каждая фиксация имеет ссылку на своего родителя. Следовательно, стрелки на диаграмме фиксации указывают от дочерней фиксации к родительской фиксации. Нам нужна ссылка на последний дочерний коммит, чтобы получить доступ к более старым коммитам в ветке.

PS - Приведенная выше диаграмма и понимание были получены из этого бесплатного курса. Несмотря на то, что курс довольно старый, знания все равно актуальны.

Висячая фиксация также возникает, если вы «исправляете» фиксацию. Например, вы много работаете, тестируете и фиксируете все файлы, а затем помните, что забыли обновить файл README. Так что вы быстро измените это, добавьте, а затем используйте «git commit --amend». Это создает новую фиксацию, которая связана с историей коммитов, а исходная фиксация остается висящей.

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