Удаляет ли ветка в git ее из истории? - PullRequest
173 голосов
/ 10 апреля 2010

Исходя из SVN, только начинает знакомиться с Git.

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

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

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

Ответы [ 3 ]

225 голосов
/ 10 апреля 2010

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

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

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

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

79 голосов
/ 11 апреля 2010

В Git ветви - это просто указатели (ссылки) на коммиты в направленном ациклическом графе (DAG) коммитов. Это означает, что удаление ветви удаляет только ссылки на коммиты, что может сделать некоторые коммиты в группе доступности базы данных недоступными, а значит, невидимыми. Но все коммиты, которые были в удаленной ветке, все еще будут в репозитории, по крайней мере до тех пор, пока недостижимые коммиты будут удалены (например, с помощью git gc).

Обратите внимание, что git branch -d откажется удалить ветку, если не может быть уверена, что ее удаление не приведет к недоступности коммитов. Вам нужно использовать более сильный git branch -D, чтобы принудительно удалить ветку, если она может оставить недоступные коммиты.

Обратите также внимание, что недоступные коммиты, если они присутствуют, являются только теми коммитами, которые находятся между последним кончиком удаленной ветви и коммитом, который был объединен с другой существующей веткой, любым теговым коммитом или точкой ветвления; что будет позже. Например, в следующей ситуации:

----O----*----*----/M----*    <-- master <-- HEAD
     \            /
      \--.----.--/--x---y     <-- deleted branch

только коммиты 'x' и 'y' станут недоступными после удаления ветки.

Если вы работали с удаленной веткой в ​​течение периода gc.reflogExpire (по умолчанию 90 дней), последний совет удаленной ветви будет записан в журнале HEAD (см. git reflog show HEAD или git log --oneline --walk-reflogs HEAD). Вы должны иметь возможность использовать HEAD reflog для восстановления удаленного указателя. Также обратите внимание, что в этом случае недоступные коммиты только в удаленной ветви будут защищены от сокращения (удаления) в течение периода gc.reflogExpireUnreachable, который по умолчанию составляет 30 дней.

Если вы не можете найти подсказку только что удаленной ветви в reflog для HEAD, вы можете попытаться использовать git fsck, чтобы найти «недостижимый коммит », и изучить их (через git show <sha1> или * 1021). *) найти подсказку удаленной ветки.

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

git branch <deleted-branch> <found-sha1-id>

Обратите внимание, что reflog для ветки будет потерян.


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

2 голосов
/ 07 января 2013

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

...