У Git гілки є лише покажчиками (посиланнями) на коміти у спрямованому ациклічному графіку (DAG) комітів. Це означає, що при видаленні гілки видаляються лише посилання на коміти, які можуть зробити деякі зобов’язання в DAG недоступними, таким чином невидимими. Але всі коміти, які були на видаленій гілці, все одно будуть знаходитись у сховищі, принаймні до тих пір, поки недоступні комітети не будуть обрізані (наприклад, використання git gc
).
Зауважте, що git branch -d
відмовитись у видаленні гілки, якщо вона не може бути впевнена, що її видалення не залишить недоступних зобов'язань. Вам потрібно використовувати сильніший, git branch -D
щоб примусити видалити гілку, якщо це може залишити недоступні коміти.
Зауважте також, що недоступні комісії, якщо вони є, - це лише ті коміти між останньою підказкою видаленої гілки та будь-якою коміттю, яка об'єдналася з іншою існуючою гілкою, будь-якою позначеною коміткою або точкою розгалуження; що пізніше. Наприклад у такій ситуації:
---- O ---- * ---- * ---- / M ---- * <- майстер <- ГОЛОВА
\ /
\ -. ---- .-- / - x --- y <- видалена гілка
лише фіксує "x" і "y" стане недосяжним після видалення гілки.
Якщо ви працювали над видаленою гілкою протягом gc.reflogExpire
періоду, за замовчуванням 90 днів, у вас буде остання порада видаленої гілки, записана в рефлозі HEAD (див. git reflog show HEAD
Або git log --oneline --walk-reflogs HEAD
). Ви повинні мати змогу використовувати регламент HEAD для відновлення видаленого вказівника. Зауважте також, що в цьому випадку недосяжні зобов’язання лише у видаленій гілці захищатимуться б від обрізки (видалення) протягом gc.reflogExpireUnreachable
періоду, який за замовчуванням становить 30 днів.
Якщо ви не можете знайти підказку щойно видаленої гілки в рефлозі для HEAD, ви можете спробувати скористатися, git fsck
щоб знайти "недоступний фіксатор <sha1>", і вивчити їх (через git show <sha1>
або git log <sha1>
), щоб знайти кінчик видаленої гілки.
Незалежно від того, як ви знайдете кінчик видаленої гілки, ви можете скасувати видалення або, скоріше, заново створити щойно видалену гілку за допомогою
git branch <deleted-branch> <found-sha1-id>
Зауважте, що рефлог для філії буде втрачено.
Існує також скрипт git-resurrect.sh, в contrib/
якому допомагає знайти сліди кінчика гілки з вказаним іменем та воскресити (відновити).