Удаляет ли ветку в git ее удаление из истории?
Переход из svn, только начинающий знаком с git.
Когда ветка удаляется в git, удаляется ли она из истории?
В svn вы можете легко восстановить ветвь, вернув операцию удаления (обратное слияние). Как и все удаления в svn, ветвь никогда не удаляется, она просто удаляется из текущего дерева.
Если ветвь фактически удалена из истории в git, что происходит с изменениями, которые были объединены с этой веткой? Сохраняются ли они?
Ответы
Ответ 1
Филиалы - это всего лишь указатели на фиксацию в git. В git каждый коммит имеет полное исходное дерево, это очень другая структура из svn, где все ветки и теги (по соглашению) живут в отдельных "папках" репозитория вместе со специальной "стволом".
Если ветвь была объединена в другую ветвь до ее удаления, все транзакции по-прежнему будут доступны из другой ветки, когда первая ветвь удалена. Они остаются такими же, как они.
Если ветка удаляется без объединения в другую ветвь, то фиксация в этой ветке (вплоть до момента, когда разветвлено из фиксации, которая все еще доступна) перестает быть видимой.
Коменты все равно сохраняются в репозитории, и их можно восстановить сразу после удаления, но в конечном итоге они будут собраны в мусор.
Ответ 2
В Git ветки - это просто указатели (ссылки) для фиксации в направленном ациклическом графе (DAG) коммитов. Это означает, что удаление ветки удаляет только ссылки на коммиты, что может сделать некоторые коммиты в DAG недоступными, поэтому невидимыми. Но все фиксации, которые были на удаленной ветке, все равно будут находиться в репозитории, по крайней мере до тех пор, пока недостижимые коммиты не будут обрезаны (например, с помощью git gc
).
Обратите внимание, что git branch -d
откажется удалить ветку, если не может быть уверен, что ее удаление не оставит недостижимых коммитов. Вам нужно использовать более сильный git branch -d
, чтобы принудительно удалить ветвь, если она может оставить недостижимые коммиты.
Обратите также внимание на то, что недостижимые коммиты, если они присутствуют, - это только те, которые совершают связь между последним концом удаленной ветки и либо фиксацией, которая была объединена с другой существующей ветвью, любым помеченным фиксацией или точкой ветвления; в зависимости от того, что наступит позже. Например, в следующей ситуации:
----O----*----*----/M----* <-- master <-- HEAD
\ /
\--.----.--/--x---y <-- deleted branch
только фиксирует "x", а "y" становится недостижимым после удаления ветки.
Если вы использовали удаленную ветвь в течение периода gc.reflogExpire
, по умолчанию 90 дней, у вас будет последний конец удаленной ветки, записанной в HEAD reflog (см. git reflog show HEAD
или git log --oneline --walk-reflogs HEAD
). Вы должны использовать HEAD reflog для восстановления удалённого указателя. Также обратите внимание, что в этом случае недостижимая запись только в удаленной ветки будет защищена от обрезки (удаления) в течение периода gc.reflogExpireUnreachable
, который по умолчанию составляет 30 дней.
Если вы не можете найти подсказку только что удаленной ветки в reflog для HEAD, вы можете попытаться использовать git fsck
для поиска "unreachable commit <sha1 > " и изучить их (через git show <sha1>
или git log <sha1>
), чтобы найти кончик удаленной ветки.
Независимо от того, как вы найдете подсказку удаленной ветки, вы можете отменить удаление или, скорее, повторно создать только что удаленную ветку, используя
git branch <deleted-branch> <found-sha1-id>
Обратите внимание, что reflog для ветки будет потерян.
Существует также git-resurrect.sh script в contrib/
, который помогает находить следы кончика ветки с заданным именем и воскрешать (восстановить ) это.
Ответ 3
Если вы беспокоитесь о случайно удаленных ветких и больше не имеете локальной копии своего репо, есть расширения для корпоративных серверов Git, таких как Gerrit, которые будут обнаруживать перезаписи истории и удаления ветвей, будут поддерживать их под специальный ref, чтобы они могли быть восстановлены, если необходимо, и не будут обрезаны сборкой мусора. Администраторы Gerrit могут по-прежнему удалять выбранные коммиты, если это необходимо по юридическим причинам.