Git: що таке звисання / крап і звідки вони беруться?


148

Я шукаю основну інформацію про звисаючі коміти та краплі.

Моє репо здається чудовим. Але я git fsckвперше забіг, щоб побачити, що це зробило, і у мене довгий список «звисаючих крапель» та одного «звисаючого вчинку».

Що це за речі? Звідки вони взялися? Чи вказують вони щось незвичне (добре чи погане) про стан мого репо?

Відповіді:


95

Під час роботи з вашим сховищем git, ви можете закінчити резервну роботу та робити інші рухи, які спричиняють посередницькі краплі, і навіть деякі речі, які git робить для вас, щоб уникнути втрати інформації.

Врешті-решт (умовно, згідно зі сторінкою git gc man ) він здійснить збір сміття та очистить ці речі. Ви також можете змусити його активуючи процес збору сміття, git gc.

Для отримання додаткової інформації про це, див. Технічне обслуговування та відновлення даних на сайті git-scm.

Ручний запуск GC за замовчуванням піде за 2 тижні до часу виконання цієї команди безпекової мережі. Насправді рекомендується періодично запускати GC, щоб забезпечити ефективне використання вашого сховища git. Як і все, ви повинні зрозуміти, що це робить, перш ніж знищити ті речі, які можуть бути для вас важливими.


10
Тож справедливо сказати, що 1) якщо я не думаю, що з моїм репо є щось не так, безпечно їх видалити git gc, і 2) мені зовсім не потрібно про це турбуватися, тому що ці звисаючі шматочки є нормальними і вже git впоратися з ними?
сумневу1ejack

7
Це було б справедливою оцінкою.
vgoff

9
Крім того, щоразу, коли ви додаєте файл, але не вказуєте таку точну версію файлу, ви потрапляєте у висячу крапку. Не варто хвилюватися.
canton7

7
сумневу1ejack - Взагалі кажучи, ви не повинні запускати сміття вручну. Це шкідлива звичка потрапляти, і git робить збирання сміття, коли це потрібно. Недоліком керувати ним вручну є те, що ви втратили можливість відновити звисаючі краплі та зобов’язання, які ви, можливо, не хочете зараз, але можете захотіти в майбутньому. Після запуску збору сміття ви забираєте у Git деякі досить потужні функції відновлення. Використовуйте обережно і, як виняток, не правило. --- Дозвольте git зробити свою справу.
Ілля Лінн

95

Dangling blob = Зміна, яка внесла його в область / індекс постановки, але ніколи не вчинялася. Одна річ, яка дивує git - це те, що після того, як її додають до місця постановки, ви завжди зможете повернути її назад, тому що ці краплі поводяться як коміти в тому, що вони теж мають хеш !!

Dangling commit = Комісія, до якої безпосередньо не пов’язано жодне дочірнє зобов’язання, гілка, тег чи інша посилання. Ви також можете їх повернути!


5
Чи повинні "предки" читати "нащадків"? Взагалі, ви не можете досягти жодного git-комітету через його предків.
Філ Міллер

@Novelocrat У мене була така ж думка, я згоден, це, мабуть, має читати нащадок.
сткент

1
Я все ще читаю "висхідників" у вашій відповіді. Здається, ваше видання від 2 липня не виправило друкарські помилки.
iclman

Як ти повернеш звисаючу крапку?
HelloGoodbye

1
@ElijahLynn Ви маєте рацію. Думаю, я занадто швидко прочитав дискусії. Висячий вчинок не має нащадка / дитини і не посилається на тег чи гілку.
iclman

44

ЯК видалити всі звисаючі комісії зі свого сховища 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

Переконайтеся, що ви дійсно хочете їх видалити, оскільки ви, можливо, вирішите, що вони вам потрібні.


5
Насправді більшість користувачів ніколи цього не потребують, і якщо вони це роблять, можливо, це стосується програмного випадку. На мою думку, збережений дисковий простір або збільшена швидкість, видаляючи звисаючі коміти.
Ілля Лінн

1
Це відповідає на інше питання.
Ілля Лінн

5

Висячий вчинок - це зобов'язання, яке не пов'язане з посиланням, тобто немає способу його досягти.

Наприклад, розглянемо діаграму нижче. Припустимо, що ми видаляємо функцію гілкиX без об'єднання її змін, тоді фіксація D перетворюється на звисаючу фіксацію, оскільки немає посилання, пов'язаної з нею. Якби це було об'єднано в master, тоді HEAD та master посилання вказували б на виконання D, і це більше не буде звисати, навіть якщо ми видалили функціюX. Прочитайте замітку після схеми, щоб зрозуміти це краще.

Git автоматично збирає сміття (тобто утилізує), що звисає. Ми можемо використовувати git reflogдля відновлення гілки (висячих комітетів), яку було видалено без об'єднання. Ми можемо відновити видалені комісії, лише якщо вони є в локальному магазині об'єктів. Якщо це було зібране сміття, ми не можемо його відновити.

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

Зверніть увагу, що назва гілки, тобто мітка гілки, насправді є посиланням на останню комісію гілки, тобто на кінчик гілки. На діаграмі вище, FeatureX, master та HEAD - лише посилання на конкретні коміти. labelX і основні мітки стосуються останніх комісій у відповідних галузях. HEAD, як правило, відноситься до кінця перевіреної в даний час гілки (майстра в цьому випадку). Якщо ви зареєструєте старішу комісію на вашій поточній гілці, то HEAD буде знаходитись у відокремленому стані, тобто вона вказуватиме на старішу комісію замість останньої. Також зверніть увагу, що HEAD називається символічним посиланням, оскільки він фактично вказує на поточну мітку гілки, а будь-яка мітка гілки завжди вказує на кінчик гілки. Таким чином, за звичайних обставин, HEAD опосередковано вказує на останнє зобов'язання.

Зауважте, що Git представляє свій графік / історію фіксації як спрямований ациклічний графік . Кожен комітет має посилання на його батьків. Отже, стрілки в діаграмі фіксування вказують від дочірньої фіксації до батьківської фіксації. Нам потрібна посилання на останнє дочірнє зобов’язання, щоб досягти старших домовленостей на гілці.

PS - Наведена вище схема та розуміння отримані з цього безкоштовного курсу . Незважаючи на те, що курс досить старий, знання все ще актуальні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.