Удаление ветки Git


79

Что в Git означает «удаление» ветки?

Он исчезнет из репозитория? Или по-прежнему можно будет перейти через git branch?

Что я действительно хочу сделать, так это пометить ветку как «тупиковую», т. Е. Ветка так далеко от мастера, что никто не должен использовать ее в качестве отправной точки, хотя в этой ветке было несколько хороших идей, поэтому мы бы хотел бы сохранить его для справки.

Ответы:


157

Вы можете удалить ветку, но сначала пометьте ее, чтобы ее история не исчезла. Таким образом, ветвь не отображается в списке веток, что должно удерживать людей от работы над ней, но работа не будет стерта навсегда (даже после запуска сборки мусора). Например, если у меня есть ветка, которая стала неактуальной, но я не готов удалить ее навсегда, я помечаю ее как «архив / < имя-ветки >».

В то время как в masterдругой ветке:

git tag archive/foo foo
git branch -D foo

Это создает тег с именем archive/fooиз fooветки перед удалением foo. Вы также можете добавить к тегу сообщение, в котором объясняется, что находится в ветке, почему он существует, почему сейчас тупик и т. Д.

git tag -m 'Foo is deprecated in favor of bar' archive/foo foo

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

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

git branch foo archive/foo
git tag -d archive/foo       # Optional

Теперь ветка вернулась, как будто никогда не удалялась.


5
@sardaukar: это также может работать с удаленными репозиториями, нажав архивный тег (используя --tagsпараметр to git push), а затем удалив удаленную ветку (используя :<branch-to-delete>refspec при нажатии). Например:git tag archive/foo foo; git branch -D foo; git push --tags origin :foo
Дэн Молдинг

Было бы неплохо, если бы у git был способ автоматически информировать людей «эта ветка была заархивирована» и показывать сообщение фиксации, если люди пытались извлечь из заархивированной ветки, но это не так.
Робин Грин

1
Очень хороший ответ, именно то, что я искал! На всякий случай, полезно ли это, если ветка была снова слита с мастером перед удалением?
claf

Еще один связанный с этим вопрос (если кто-то все еще следит за этой веткой): как мне «закрыть» (объединить в мастер или архив в тег или что-то еще), если в этой ветке задействовано несколько разработчиков? удаление и маркировка ветки (как локальной, так и удаленной) не слишком грубо для других разработчиков этой ветки?
claf

1
этот ответ - отличное, блестящее решение
Кристофер Томас

2

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

$ git branch
* master
  testing_feature_one
  testing_feature_two
$ git branch -m testing_feature_one deprecated/testing_feature_one
$ git branch
  deprecated/testing_feature_one
* master
  testing_feature_two

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



0

По нему нельзя будет перемещаться через ветку git, и пока не будет выполнена сборка мусора, он не будет утерян из репозитория.

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

Обозначение его (любым способом) как исторического справочника работает.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.