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