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

149

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

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

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

doub1ejack
источник

Ответы:

96

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

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

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

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

vgoff
источник
10
Так что будет справедливо сказать, что 1) если я не думаю, что с моим репо что-то не так, его можно безопасно удалить git gc, и 2) мне вообще не нужно об этом беспокоиться, потому что эти висящие биты нормальны и уже мерзавцы справиться с ними?
doub1ejack
7
Это было бы справедливой оценкой.
vgoff
9
Кроме того, каждый раз, когда вы «добавляете» файл, но не фиксируете точную версию файла, вы получаете висящий шарик. Не о чем беспокоиться.
canton7
7
oub1ejack - Вообще говоря, вы не должны запускать сборку мусора вручную. Это плохая привычка, и git выполняет сборку мусора, когда это необходимо. Недостатком его ручного запуска является то, что вы утратили способность восстанавливать висячие двоичные объекты и коммиты, которые вы, возможно, не хотите сейчас, но, возможно, захотите в будущем. Запустив сборку мусора, вы убираете из git довольно мощную функцию возврата. Используйте с осторожностью и, как исключение, не правило. --- Просто позволь мерзавцу сделать свое дело.
Элайджа Линн
96

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

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

Элайджа Линн
источник
5
Должны ли «предки» читать «потомки»? В общем, вы не можете получить доступ к git commit через его предков.
Фил Миллер
@Novelocrat У меня была та же мысль, я согласен, что, вероятно, следует читать потомков.
stkent
1
Я все еще читаю «восходящие» в вашем ответе. Похоже, ваше издание от 2 июля не исправило опечатку.
iclman
Как вы получаете обратно болтающийся шарик?
Здравствуйте, до свидания
1
@ElijahLynn Вы правы. Я думаю, что я слишком быстро читаю обсуждения. Висячий коммит не имеет потомка / потомка и на него не ссылается тег или ветвь.
iclman
44

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

Убедитесь, что вы действительно хотите удалить их, так как вы можете решить, что они вам нужны.

qxo
источник
5
На самом деле, большинству пользователей это никогда не нужно, и если они это делают, то, вероятно, для программного использования. По моему мнению, экономия дискового пространства или увеличение скорости за счет удаления висячих коммитов не стоит усилий.
Элайджа Линн
1
Это отвечает на другой вопрос.
Элайджа Линн
6

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

Например, рассмотрите диаграмму ниже. Предположим, что мы удаляем ветку featureX без объединения его изменений, тогда коммит D станет висячим коммитом, потому что с ним не связано ни одной ссылки. Если бы он был объединен с master, то ссылки HEAD и master указали бы на коммит D, и он больше не зависал бы, даже если бы мы удалили featureX. Прочитайте примечание после диаграммы, чтобы понять это лучше.

Git автоматически собирает мусор (т.е. удаляет) висячие коммиты. Мы можем использовать git reflogдля восстановления ветку (висячих коммитов), которая была удалена без слияния. Мы можем восстановить удаленные коммиты, только если они присутствуют в локальном хранилище объектов. Если это был мусор, то мы не можем его восстановить.

введите описание изображения здесь

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

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

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

MasterJoe2
источник