Когда я должен прекратить брать на себя обязательство освоить новые проекты?


26

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

По крайней мере, так я обычно это делаю. Есть ли способ немедленно запустить ветки со второго коммита? Имеет ли смысл делать это так? Очевидно, что «Initial Commit» всегда будет на мастере, но после этого, когда я узнаю, что сейчас самое время начать создавать ветки для новых функций?

Ответы:


23

Немедленно.

Ключом является вопрос о том, какова политика для Мастера. С мерзавцем, как правило, политика филиала на Master является работоспособна релиз стабильной. Иногда Master является «основной линией», где ветки создаются и объединяются до слияния с веткой Release. Это два разных ролевых / политических подхода.

Люди часто становятся источником ошибок, чтобы изменить роль или политику филиала на протяжении всего проекта. Разработчику-одиночке легче сообщить об этих изменениях авторам, но старается, чтобы дюжина программистов все поняли: «Мастер сейчас на уровне 1.0, пожалуйста, делайте ветки, а не все настаивают на этом»

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

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

Ключевые роли и политики в филиалах просты и последовательны с самого начала.

Эту «ветку по изменению политики» можно увидеть в шаблонах ветвления . Идея каждой ветви, имеющей роли, может быть прочитана в Advanced SCM Branching Strategies . Оба они очень хорошо читают.


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

Я полностью согласен с Aaronaught, поскольку ИМХО вполне возможно (и лучшая практика) работать таким образом, чтобы переход от одного состояния сборки к следующему всегда был лишь небольшим постепенным изменением, а не большим.
Док Браун

1
@MichaelT Я видел ветки 'dev' много раз, но никогда не слышал их объяснений в контексте "раннего мастера" раньше. Я думаю, что я буду использовать это, спасибо.
Дрооганс

13

В основном есть две ситуации, когда вы обычно хотите начать работать с ветками:

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

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

Для такого рода решений я думаю, что всегда полезно думать о «новых функциях» или «исправлениях ошибок», начиная с того момента, когда у вас есть первая скомпилируемая / запускаемая версия вашей программы.

В своей знаменитой книге Майкл Фезерс перечисляет четыре причины для изменения , но я бы поставил «оптимизировать ресурсы» в разделе «ветвь новой функции» (для нефункциональной функции) и «улучшение дизайна» в большинстве случаев в разделе «ветка новой функции». Так как ИМХО никогда не следует улучшать дизайн, если он не предназначен для упрощения реализации конкретной функции.


12

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

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

Существуют и другие модели ветвления для Git, но большинство из них основаны на старых централизованных моделях SCM и могут привести к серьезным проблемам в среде DVCS. Вам на самом деле не нужно использовать расширение git-flow, и вам не обязательно нужны все эти ветки release / hotfix / feature, но голыми являются developи master, и нестабильный код входит develop.


Тебе даже не нужен этот первый коммит master. Помните, что masterнет ничего особенного для мерзавца, это не должно быть там. Вы можете просто иметь ветку разработки, пока не захотите сделать релиз.
Майлз Рут

2
@MilesRout: Хотя это в принципе верно, вы не можете объединиться, если ветвь уже не существует, и процесс требует, чтобы каждое принятие к мастеру было слиянием без ускоренной перемотки вперед. Если я что-то не упустил, единственной альтернативой первоначальному пустому коммиту будет ветвь master от некоторой произвольной ветки коммита разработки или релиза, что будет означать, что они будут использовать один и тот же коммит, что вы должны избегать.
Aaronaught

1
Ах, это действительно хороший момент. +1 к посту и комментарию.
Майлз Рут

1

Нил Форд из Thoughtworks выступает за использование функции переключения между ветвлениями, чтобы избежать проблемы «слияния ада». Рассмотрим случай, когда два программиста ежедневно покорно сливаются с основной веткой, и один из них вносит значительные изменения в течение нескольких недель, а затем совершает коммиты. Другой программист вполне может оказаться в аду слияния. Чтобы избежать этой проблемы, Ford рекомендует «продвигать боль вперед» (хорошо известный проворный атрибут), имея только одну ветвь и совершая ее ежедневно. Дополнительные функции добавляются с помощью переключателей функций, которые отключают функцию, пока она не будет полностью протестирована.

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


1

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

Чтобы уточнить, в наши дни отслеживание версий проекта с контролем исходного кода не всегда работает. (например, использование npm для управления зависимостями и определения семантических версий с помощью ^). В этом случае артефакты проекта изменяются каждый раз, когда происходит сборка, и необязательно соответствуют изменениям исходного кода каждый раз. Чтобы справиться с подобными новыми проблемами, некоторые команды предпочитают уже создавать «артефакты», сохраненные в системе управления артефактами (например, JFrog Artifactory) для отслеживания версий проекта.

Очевидно, что когда у вас уже есть управление версиями артефактов, вы не будете извлекать «рабочий код» из ветви GIT и собирать / развертывать в производство, вместо этого вы обращаетесь к системе управления артефактами для непосредственно запускаемых версий для развертывания. В таких случаях понятие «ветвь релиза» внезапно теряет смысл. И всякий раз, когда ваша команда решает не связывать ветку git с версией релиза, фиксация / нажатие непосредственно на master снова становится разумным выбором: она становится веткой по умолчанию при клонировании репо, следовательно, автоматически, учитывая семантику, широко принятую и хорошо проинформированную меняется. Тем не менее, как следует из принятого ответа, вам, вероятно, следует перейти к назначению роли для ветвей, включая master, и использовать эти ветви только для этих конкретных ролей.

И наконец, я иду еще дальше и предлагаю использовать master в качестве ветки разработки в проектах, в которых задействовано лишь несколько основных коммиттеров. Что касается моей команды и, вероятно, то же самое для большинства магазинов микро-услуг. Фиксация на мастере удаляет процесс обмена информацией и потенциально позволяет избежать «ада слияния» при работе с функциями в нескольких спринтах. Более того, код в основной ветке даже не должен «работать», автоматизированный процесс сборки / тестирования скажет вам, что пошло не так, и в любом случае достаточно просто проверить историю git и связаться с автором, который нарушил сборку / тестирование :-)


0

Я собираюсь занять радикальную позицию: разветвляться на каждую идею. Сначала в git ветки дешевы, основная стоимость ветки - это помнить, для чего она нужна. Я также согласен с тем, что первый коммит для мастера - это кандидат на освобождение. Я рекомендую начать с подтверждения концепции ветки. Когда вы подтвердите свою концепцию, вы можете объединить ее с пустой веткой devel или переписать в зависимости от того, насколько хороша ваша первая попытка. с этого момента вы переходите от devel к каждой ошибке, функции, абстракции и т. д.

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