Когда удалять ветки в Git?

Предположим, у нас есть стабильное приложение.

Завтра кто-то сообщает о старой большой ошибке, которую мы сразу же решаем исправить. Итак, мы создаем ветку для этого исправления вне «master», называем ее «2011_Hotfix» и продвигаем ее вверх, чтобы все разработчики могли сотрудничать в ее исправлении.

Мы исправляем ошибку и объединяем «2011_Hotfix» в «master», а также в текущую ветку разработки. И толкаем "хозяина".

Что нам теперь делать с "2011_Hotfix"? Должен ли он просто оставаться там как ветвь до скончания веков или мы должны удалить его, поскольку он выполнил свою задачу? Кажется нечистым просто оставлять ветки повсюду, так как список ветвей, вероятно, станет очень длинным, большинство из которых даже больше не нужны.

Что будет с его историей в случае его удаления? Будет ли это сохраняться, даже если фактическая ветка больше не доступна? Кроме того, как мне удалить удаленную ветку?


person Anthony Compton    schedule 16.03.2011    source источник
comment
Часто бывает полезно думать о ветвях как об идеях. Достаточно хорошее практическое правило состоит в том, что если вы закончили работу над идеями, которые представляет ветвь, включая завершенное тестирование и включение этих изменений (объединение их в мастер), то вы закончили с самой веткой.   -  person Cascabel    schedule 17.03.2011
comment
Что я хотел бы знать: если удаленное исправление удаляется, будет ли оно удалено локально для всех разработчиков, которые сотрудничали? Если не; как это сделать? Я бы подумал, что один человек перенесет исправление в master, но после этого его следует очистить и для всех соавторов, чтобы они не добавляли коммиты в эту ветку.   -  person rolandow    schedule 22.12.2015
comment
Вы не можете повлиять на локальные репозитории компьютеров ваших коллег. Вы должны либо сказать ему, чтобы он удалил ветку локально, либо вы также можете принудительно использовать эту серверную часть с помощью git hooks / branch security, чтобы предотвратить нажатие из вашей ветки, которое вы хотите оставить удаленным.   -  person srz2    schedule 12.02.2016


Ответы (8)


Можете спокойно удалить ветку с git branch -d yourbranch. Если он содержит не объединенные изменения (т. Е. Вы потеряете коммиты, удалив ветку), git сообщит вам и не удалит его.

Таким образом, удаление объединенной ветки обходится дешево и не приведет к потере истории.

Чтобы удалить удаленную ветку, используйте git push origin :mybranch, предполагая, что ваше удаленное имя - origin, а удаленная ветка, которую вы хотите удалить, называется mybranch.

person Artefact2    schedule 16.03.2011
comment
удаление объединенной ветки обходится дешево, но сохраняет ее. Если вы сохраните его, то это не приведет к значительному снижению производительности с точки зрения времени или пространства, которое использует git. Тем не менее, я бы удалил ветку, потому что все коммиты уже есть в истории master, так что это делает вещи намного чище. - person MatrixFrog; 17.03.2011
comment
Одна из причин, по которой я хочу удалить ветки, заключается в следующем: мы вносим много изменений в ветки (фактически, все изменения), поэтому в конечном итоге вы получите длинный список при использовании команды «git branch». Для обзора я хочу сократить этот список. Так что старые ветки будут удалены. Релизы Reale отмечены тегами, поэтому я не обсуждаю их. - person michel.iamit; 21.05.2014
comment
Хотя я согласен с удалением веток, которые уже были объединены, если вы хотите увидеть список веток, которые не были объединены в вашу текущую ветку, вы можете использовать: git branch --no-merged - person lsklyut; 29.09.2014
comment
@MatrixFrog Это дешево с точки зрения git, однако человеческие затраты могут стать дорогостоящими. Я только что вошел в проект с примерно 40 ветвями, все с числовыми названиями ветвей. Я понятия не имею, что к чему, и почти все эти ветки устарели. Накладные расходы на поиск в этих ветках и выяснение того, что утомляет и требует времени. Так что да, технически это дешево, но на самом деле это не так. Мне нравится сохранять форму корабля репозитория git. Если его нет в активном разработчике и он был объединен, удалите его. Но это всего лишь мой МО, и я уважаю, что другие могут делать что-то другое. - person dudewad; 02.02.2015
comment
Какая команда делает --no-merged значением по умолчанию? Я попробовал git config --global --add branch.noMerged true, и он был добавлен, но это не имело никакого значения. - person Craig Silver; 13.11.2016
comment
@CraigSilver один вариант: git config --global alias.unmerged 'branch --no-merged' - person user151841; 17.05.2017

Что вам нужно сделать, так это пометить все, что вы выпускаете. Держите ветки под рукой, пока вы активно развиваетесь.

Удалите старые ветки с помощью

git branch -d branch_name

Удалите их с сервера с помощью

git push origin --delete branch_name

или старый синтаксис

git push origin :branch_name

который читается как «ничего не помещать в ветку имя в источнике».

Тем не менее, пока DAG (направленный ациклический граф) может указывать на него, коммиты будут присутствовать в истории.

Google "git-flow", и это может дать больше информации об управлении выпусками, ветвлениях и тегах.

person Adam Dymitruk    schedule 16.03.2011

Поскольку в вопросе есть тег "github", я бы также добавил это: в частности, в Github, если вы запрос на вытягивание ветки, и она будет объединена (либо через пользовательский интерфейс, либо путем слияния ветки запроса на вытягивание), вы не потеряете данные запроса на вытягивание (включая комментарии), даже если удалите ветку .

Следствие этого: если вы включаете запросы на вытягивание как часть рабочего процесса (который прекрасно сочетается с обзорами кода), вы можете безопасно удалять ветки, как только они будут объединены. Это настолько банально, что недавно Github добавил (сладкую) функцию, которая выскакивает кнопку «удалить ветку» сразу после того, как вы объединяете запрос на перенос.

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

Конечно, никакое управление историей (запросы на вытягивание или иное) не заменяет правильную маркировку версий (которую вы желательно автоматизировать с помощью того же инструмента / скрипта, который развертывает / упаковывает версию), поэтому вы всегда можете быстро переключиться на то, что ваши пользователи случайно используют в данный момент. Пометка также является ключом к решению вашей исходной проблемы: если вы установили, что любая ветвь, объединенная с "рабочими" ветвями, может и должна быть удалена, и что любая ветвь, объединенная с тегом версии, "производственной" и т. Д., Не должна , у вас всегда будут исправления, пока они не будут интегрированы в будущую версию.

person chesterbr    schedule 07.12.2012
comment
Спасибо, что объяснили, почему Github показывал мне кнопку «Удалить ветку». - person Todd Owen; 15.06.2014
comment
Мы используем исходное дерево, и это дает возможность держать открытыми локальную ветку исправления и удаленную ветку исправления. Я думал, что закрытие ветки исправлений означает ее удаление, и вы не можете использовать ее повторно. например. В течение следующих 5 дней нам нужно выпускать оперативные исправления каждый день. Потом закрываем. Но, допустим, на 6-й день нам понадобится еще одно исправление. Мы создаем новую ветку исправлений? - person Danger14; 01.07.2015
comment
Это то, что обычно делают люди. Если индивидуальное присвоение им имен невозможно, вы можете назвать их в зависимости от дня или ссылки на систему заявок, которая ими управляет (если таковая имеется). Конечно, рабочие процессы git должны применяться к тому, что лучше всего подходит для вашей команды, поэтому не волнуйтесь, если вы решите работать по-другому. - person chesterbr; 04.07.2015

Я бы добавил, что недостатком удаления веток является то, что вы нарушите любые гиперссылки на эти ветки на GitHub (этот вопрос помечен как github). Для этих ссылок вы получите 404 Not Found ошибку. Вот почему я меняю свои ссылки, чтобы они указывали на фиксацию или тег, после удаления ветки на GitHub.

Поскольку некоторые ссылки нельзя изменить, например, в электронной почте, я теперь полностью избегаю гиперссылок на ветки GitHub и с первого дня ссылаюсь на фиксацию или тег.

Я предпочитаю удалять ветки после их объединения. Это предотвращает визуальный беспорядок в длинном списке ветвей в вашем репозитории. Эти ветки также распространяются на все вилки репозитория.

Сначала удаляю свою локальную ветку. Это предотвращает его случайное нажатие позже.

git branch -d branchName

Затем удаляю ветку удаленного отслеживания

git branch -dr remoteName\branchName

Потом удаляю ветку на GitHub. Я использую веб-интерфейс, но эквивалентная команда приведена ниже.

git push remoteName :branchName

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

git tag -a tagName commitOrBranchName

Затем нажимаю тег на github

git push remoteName tagName
person Mark F Guerra    schedule 23.03.2013
comment
Когда сборщик мусора съедает коммиты ветки? Вам нужно пометить и нажать тег перед удалением ветки? - person Jared Thirsk; 11.12.2018

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

Обычные git методы удаления веток уже были описаны выше, и они работают должным образом. git не имеет команды из одного или двух слов, означающей: «Эй, git, удали и локальную, и удаленную ветвь». Но это поведение можно имитировать с помощью сценария оболочки. Например, возьмите сценарий оболочки Зака ​​Холмана 'git-nuke'. Это очень просто:

#!/bin/sh
git branch -D $1
git push origin :$1

Поместите это в исполняемый файл (например, git-nuke) в один из ваших $PATH каталогов. Если вы не находитесь в ветке 2011_Hotfix, просто запустив git-nuke 2011_Hotfix, вы удалите как локальную, так и удаленную ветки. Это намного быстрее и проще - хотя, возможно, и опаснее - чем стандартные git команды.

Ваша забота о сохранении истории - это хорошо. В этом случае вам не о чем беспокоиться. Как только вы объедините 2011_Hotfix с master, все коммиты из 2011_Hotfix будут добавлены в историю коммитов master. Короче говоря, вы не потеряете историю от простого слияния.

Я хочу добавить еще одно слово, которое, возможно, выходит за рамки вашего вопроса, но, тем не менее, актуально. Представим, что есть 20 крошечных «незавершенных» коммитов 2011_Hotfix; однако вы хотите, чтобы только одна полная фиксация для 2011_Hotfix была добавлена ​​в историю master. Как объединить все 20 маленьких коммитов в одну большую? К счастью, git позволяет объединить несколько коммитов в одну с помощью git-rebase. Я не буду здесь объяснять, как это работает; хотя, если вам интересно, документация для git-rebase отличная. Обратите внимание, что git rebase перезаписывает историю, поэтому ее следует использовать с умом, особенно если вы новичок в этом. Наконец, ваш 2011_Hotfix сценарий касается команды разработчиков, а не соло-разработчика. Если члены проектной группы используют git rebase, для команды разумно иметь четкие инструкции по использованию git rebase, чтобы какой-нибудь ковбойский разработчик в команде случайно не повредил git историю проекта.

person jfmercer    schedule 28.06.2015

Если он был успешно объединен и, возможно, даже помечен, я бы сказал, что он больше не нужен. Так что можете спокойно делать git branch -d branchname.

person Michael Fürstenberg    schedule 16.03.2011

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

git fetch --prune
person huch    schedule 18.10.2018

Вы можете удалять ветки во всех основных веб-интерфейсах, таких как github, BitBucket. После удаления ветки онлайн вы можете удалить локальную ветку, используя

git remote prune origin
person tkruse    schedule 06.12.2017