Каковы некоторые примеры часто используемых методов именования веток git? [закрыто]

1121

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

Я узнал, просматривая старые темы, что я могу начать именовать ветки с / в названии, то есть с темой / задачей или чем-то в этом роде. Я могу начать делать это и посмотреть, поможет ли это лучше организовать вещи.

Каковы некоторые рекомендации для именования веток Git?

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

skiphoppy
источник
Да - вероятно, хорошо не держать рядом и не толкать ветки, которые бесполезны после того, как вы закончите с ними. Если нет веской причины для сохранения ветки темы (например, чтобы проконсультироваться с ней позже), нет проблемы в ее удалении. Git облегчает ветвление, и следствием этого является то, что вы можете получить множество тривиальных ветвей, которые можно очистить без особых сложностей.
Эрик Уокер,
14
См. Также github.com/agis-/git-style-guide
Agis
2
Для полноты, есть некоторые последовательности символов, которые вы не можете использовать .
Ник Вестгейт
18
В сети StackExchange должно быть место для подобных вопросов. Очень неприятно раздражать, когда кто-то задает хороший вопрос, подобный этому, и тогда он закрывается за несоблюдение правил. Если это продолжится, то это, вероятно, должно сигнализировать о необходимости как-то поддерживать подобные вопросы. Только они, вероятно, должны быть реализованы на сайте переполнения, потому что они так тесно связаны с вопросами типа программирования. Для меня переполнение - это не «объективно отвечающие вопросы» (слишком конкретные), а «вопросы программирования».
Ник Рез
@Wim Мы используем ключи выпуска jira в сочетании с коротким заголовком, например:KEY-1234/allow-users-to-do-smart-stuff
RobAu

Ответы:

938

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

Соглашения об именах филиалов

  1. Используйте групповые токены (слова) в начале названия вашей ветви.
  2. Определите и используйте короткие токены, чтобы различать ветви таким образом, чтобы это имело смысл для вашего рабочего процесса.
  3. Используйте косую черту, чтобы отделить части имен вашей ветви.
  4. Не используйте голые числа в качестве ведущих частей.
  5. Избегайте длинных описательных имен для долгоживущих ветвей.

Групповые токены

Используйте жетоны группировки перед именами веток.

group1/foo
group2/foo
group1/bar
group2/bar
group3/bar
group1/baz

Группы могут быть названы так, как вам нравится, в соответствии с вашим рабочим процессом. Мне нравится использовать короткие существительные для моего. Продолжайте читать для большей ясности.

Короткие четко определенные токены

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

wip       Works in progress; stuff I know won't be finished soon
feat      Feature I'm adding or expanding
bug       Bug fix or experiment
junk      Throwaway branch created to experiment

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

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

new/frabnotz
new/foo
new/bar
test/foo
test/frabnotz
ver/foo

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

$ git branch --list "test/*"
test/foo
test/frabnotz

$ git branch --list "*/foo"
new/foo
test/foo
ver/foo

$ gitk --branches="*/foo"

Используйте косую черту для разделения частей

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

$ git push origin 'refs/heads/feature/*:refs/heads/phord/feat/*'
$ git push origin 'refs/heads/bug/*:refs/heads/review/bugfix/*'

Для меня косые черты также работают лучше для расширения вкладки (завершение команды) в моей оболочке. Как я настроил, я могу искать ответвления с разными частями, печатая первые символы части и нажимая клавишу TAB. Затем Zsh дает мне список ветвей, которые соответствуют части набранного мной токена. Это работает как для предыдущих токенов, так и для встроенных.

$ git checkout new<TAB>
Menu:  new/frabnotz   new/foo   new/bar


$ git checkout foo<TAB>
Menu:  new/foo   test/foo   ver/foo

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

Он также позволяет вам искать ветки во многих командах git, например:

git branch --list "feature/*"
git log --graph --oneline --decorate --branches="feature/*" 
gitk --branches="feature/*" 

Предостережение: как отмечает Слипп в комментариях, косые черты могут вызвать проблемы. Поскольку ветви реализованы как пути, вы не можете иметь ветку с именем "foo" и другую ветку с именем "foo / bar". Это может сбивать с толку новых пользователей.

Не используйте голые числа

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

$ git checkout CR15032<TAB>
Menu:   fix/CR15032    test/CR15032

Если бы я попытался расширить только 15032, git не был бы уверен, хочу ли я искать SHA-1 или имена ветвей, и мой выбор был бы несколько ограничен.

Избегайте длинных описательных имен

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

С другой стороны, длинные имена ветвей могут быть более полезны при «фиксации слияний», если вы не переписываете их вручную. По умолчанию сообщение о слиянии Merge branch 'branch-name'. Может оказаться более полезным, чтобы сообщения о слиянии отображались как Merge branch 'fix/CR15032/crash-when-unformatted-disk-inserted'не просто Merge branch 'fix/CR15032'.

phord
источник
156
Одним из недостатков использования комбинации форм, таких как bug/20574/frabnotz-finderи, bug/20424является то, что как только вы начнете без вложенного токена, вы не сможете добавить его позже и наоборот. Например: если вы создаете bug/20424ветку, вы не сможете создать bug/20424/additional-fixingветку позже (если не удалите bug/20424ветку). Аналогично, если bug/20574/frabnotz-finderэто уже ветка, вы не можете создать bug/20574ветку. Я склонен либо использовать разделитель без суб-токена в подобных случаях (например bug/20574_frabnotz-finder), либо выбрать имя по умолчанию для суб-токена (например bug/20424/main).
Слипп Д. Томпсон
5
Он также имеет преимущество, заключающееся в том, что некоторые инструменты на основе Git с графическим интерфейсом позволяют свернуть разделение токенов, например, представление списка каталогов. В приведенном выше примере, вы бы увидеть featureгруппу и bugгруппа, расширяемая , чтобы показать foo, barтег для бывших и 20574, 20592групп и 20424, 21334тегов для последнего.
Слипп Д. Томпсон
47
Я собираюсь начать кампанию, чтобы никогда не использовать косые черты в именах git-веток. Причина этого заключается в том, что если, например, в CI вы хотите ссылаться на имя ветви при упаковке кода, например, вы хотите ссылаться на имя ветви при построении URI или PATH (например), возможно, при сборке URI в скрипте bash; у вас будут проблемы со сборкой URI из-за косой черты, добавляющей часть URL. Да, можно заменить косую черту, но у меня уйдет много времени, чтобы разобраться.
Адам Спенс
13
Является ли проблемой то, что косые черты имеют значение для мерзавца в некоторых случаях? Например, в ответ на git branch -aполучение remotes/origin/master, получение и т. Д. Когда я вижу, что git расскажет мне о ветке, я не использую косую черту, и поэтому, когда я ее вижу, я знаю, что это «особая» ссылка.
Dogweather
11
Не могли бы вы использовать несколько примеров вместо foo и bar, пожалуйста?
Достойно7
329

У успешной модели ветвления Git Винсента Дриссена есть хорошие предложения. Картинка ниже. Если вам подходит эта модель ветвления, рассмотрите расширение потока для git . Другие прокомментировали поток

Модель Дриссена включает в себя

  • Основная ветка, используемая только для выпуска. Типичное имя master.

  • "Развивающийся" филиал этого филиала. Это тот, который используется для большинства основных работ. Обычно называется develop.

  • Многофункциональные ветви развивающейся ветви. Имя основано на названии функции. Они будут объединены в развитие, а не в основную ветку или ветки выпуска.

  • Релиз ветки для хранения кандидатских релизов, только с исправлениями ошибок и без новых функций. Типичное имя rc1.1.

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

введите описание изображения здесь

Брайан Карлтон
источник
129
За исключением того, что он на самом деле не решает вопрос, так как он оставляет кучу соглашений об именах для пользователя, особенно для функциональных ветвей (они могут быть «чем угодно, кроме master, development , release- или hotfix- »)
Brian
1
@Brian Что поможет соглашение о присвоении имен в контексте проблем, которые решает модель? В настоящее время я не вижу, как на самом деле помогает дальнейшее разграничение характеристик. Может быть, будущее против следующего выпуска, но это подлежит обсуждению и, следовательно, не должно быть частью названия. Для удобства чтения, может быть, достаточно просто добавить их к feature- *. Вы вставали проголосовали несколько раз, так что мне просто интересно услышать ваш мыслительный процесс ...
Ник Рез
2
Несмотря на хорошую информацию, этот ответ направлен на решение вопроса о потоке, а не об именовании. Я думаю, что ОП хотел бы знать, какие слова использовать (существительные против глаголов), разделители, падеж и т. Д.
Caltor
6
В книге «Непрерывная доставка» (стр. 36) утверждается, что эта модель является своего рода противоположностью непрерывной интеграции, ... по сути, она не очень «гибкая».
Маркон
Это на самом деле не отвечает на вопрос, который был задан. Это действительно дает представление об интеграции конкретного рабочего процесса git в всеобъемлющий график разработки и выпуска, однако, операционист ищет советы по соглашениям о том, как на самом деле называть ветви.
Уилер
56

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

Вместо того, чтобы пытаться использовать имя ветви для объяснения значения ветви, я начинаю строку темы сообщения о коммите в первом коммите этой ветви с «Branch:» и включаю дополнительные объяснения в текст сообщения, если тема не дает мне достаточно места.

Имя ветки, которое я использую, является просто ручкой для ссылки на ветку темы во время работы над ней. Когда работа над веткой темы завершена, я избавляюсь от названия ветки, иногда помечая коммит для дальнейшего использования.

Это также делает вывод git branchболее полезным: в нем перечислены только долгоживущие ветки и активные ветки тем, а не все ветки.

Аристотель Пагальцис
источник
53

Я смешивал и сопоставлял по разным схемам, которые я видел, и основываясь на инструментах, которые я использую.
Таким образом, мое законченное имя ветви будет:

имя / функция / проблемно-трекер номер / короткое описание

что бы перевести на:

микрофон / блоги / RSSI-12 / логотип затруднительного

Части разделены прямой косой чертой, потому что они интерпретируются как папки в SourceTree для упрощения организации. Мы используем Jira для отслеживания проблем, поэтому включение номера облегчает поиск в системе. Включение этого числа также делает его доступным для поиска при попытке найти эту проблему внутри Github при попытке отправить запрос на извлечение.

MikeG
источник
Я такой же, за исключением номера ошибки / функции в сообщении фиксации (для интеграции с GitHub -> Pivotal Tracker).
Лев
Мне интересно, что означает RSSI.
Реншуки
@renshuki это просто общий ключ проекта Jira. Какой бы трекер проблем вы не использовали, введите идентификатор билета
MikeG
@MikeG спасибо за точность!
Реншуки
3
Я использую то же самое, за исключением того, что я name/feature/issue-tracker-number-short-description
передаю
22

Почему для каждой задачи требуется три ветви / слияния? Можете ли вы объяснить больше об этом?

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

Поскольку эти ветви в конечном итоге объединяются в master, вы должны безопасно удалить их после объединения. Если вы не объединяетесь --squash, вся история отрасли будет существовать, если она вам когда-нибудь понадобится.

farktronix
источник
12

Обратите внимание: как показано в commit e703d7 или commit b6c2a0d (март 2014 г.), который теперь является частью Git 2.0, вы найдете другое соглашение об именах (которое вы можете применить к веткам).

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

Имя ветви не может содержать пробел (см. « Какие символы недопустимы в имени ветви? » И git check-ref-formatсправочную страницу ).

Поэтому для каждого имени ветви, которое будет представлено выражением из нескольких слов, использование ' -' (тире) в качестве разделителя является хорошей идеей.

VonC
источник
7

Следуя предложению farktronix, мы использовали номера билетов Jira для похожих в mercurial, и я планирую продолжать использовать их для веток git. Но я думаю, что сам номер билета, вероятно, достаточно уникален. Хотя было бы полезно иметь в названии ветки описательное слово, как заметил farktronix, если вы переключаетесь между ветвями достаточно часто, вы, вероятно, хотите меньше печатать. Затем, если вам нужно знать название филиала, поищите в Jira связанные ключевые слова в заявке, если вы не знаете его. Кроме того, вы должны включить номер билета в каждом комментарии.

Если ваша ветвь представляет версию, кажется, что общепринятым условием является использование формата xxx (пример: "1.0.0") для имен ветвей и vx.xx (пример "v1.0.0") для имен тегов (чтобы избежать конфликта) , См. Также: есть ли там стандартное соглашение об именах для git-тегов

Гари С. Уивер
источник
1
Есть ли проблема с конфликтами? Если намерение состоит в том, чтобы v1.2.4ветвь в конечном итоге приводила к конечной точке с v1.2.4тегом (правильно ли я полагаю, что в такой ситуации вы одновременно называете ветви и теги после версии) , то имеет ли это значение? Тэг все еще может быть достигнут в точке, refs/tags/v1.2.4а ветвь - в refs/heads/v1.2.4, и кажется, что Git предпочтет имя тэга, когда оно неоднозначно (с предупреждением).
Слипп Д. Томпсон
1
Для примера версии, как я упоминал в своем ответе, рекомендуется использовать префикс «v» для имен тегов, а не ветвей. Избегайте двусмысленности, если вы можете избежать недопонимания и потому, что это может вызвать проблемы при переходе к следующему новейшему и лучшему VCS.
Гэри С. Уивер
2
Недавно я работал с репо, где мы закрывали каждую ветку версии тегом с тем же именем. Это работало очень хорошо, потому что двусмысленность практически отсутствует (тег указывает на последний коммит в соответствующей ветке в большинстве случаев), и когда это возможно, Git «делает правильные вещи» (с предупреждением). Я предпочитаю это, потому что, если кто-то совершит ошибку с костью и продолжит работу с закрытой веткой, Git продолжит выбирать тег, который является намерением. Неоднозначность может упростить ситуацию, когда в системе все под контролем, а цель понятна.
Слипп Д. Томпсон