Удаляет ли ветку в 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 могут по-прежнему удалять выбранные коммиты, если это необходимо по юридическим причинам.