Удаление ветки в git удаляет ее из истории?

исходя из svn, только начинаю знакомиться с git.

когда ветвь удаляется в git, она удаляется из истории?

в svn вы можете легко восстановить ветку, вернув операцию удаления (обратное слияние). Как и все удаления в svn, ветвь никогда не удаляется, она просто удаляется из текущего дерева.

Если ветвь фактически удалена из истории в git, что происходит с изменениями, которые были объединены из этого бранч? Они сохраняются?

3 ответов


ветви - это просто указатели на коммиты в git. В git каждая фиксация имеет полное исходное дерево, это очень отличная структура от svn, где все ветви и теги (по соглашению) живут в отдельных "папках" репозитория рядом со специальным "стволом".

Если ветвь была объединена в другую ветвь до того, как она была удалена, то все коммиты по-прежнему будут доступны из другой ветви при удалении первой ветви. Они остаются такими же, как и были. были.

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

коммиты по-прежнему будут сохранены в репозитории, и их можно восстановить сразу после удаления, но в конечном итоге они будут собраны в мусор.


в 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 для головы, вы можете попробовать использовать git fsck чтобы найти "недостижимый commit " и изучить их (через git show <sha1> или git log <sha1>), чтобы найти кончик удаленной ветви.

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

git branch <deleted-branch> <found-sha1-id>
Примечание. что reflog для филиала будут потеряны.

появилась git-resurrect.sh скрипт contrib/ который помогает найти следы наконечника ветви с заданным именем и воскресить (восстановить) его.


Если вы беспокоитесь о случайно удаленных ветвях и больше не имеете локальной копии вашего РЕПО, есть расширения для корпоративных серверов Git, таких как Gerrit, которые будут обнаруживать перезаписи истории и удаления ветвей, будут поддерживать их под специальным ref, чтобы они могли быть восстановлены при необходимости и не будут обрезаны сборкой мусора. Администраторы Gerrit могут удалить выбранные коммиты, если это необходимо по юридическим причинам.