Настройка ветвей, когда функции взаимосвязаны - PullRequest
1 голос
/ 24 февраля 2012

Скажем, у нас есть веб-приложение в git. Мы занимаемся локализацией, поэтому у нас есть длинная ветка тем 'loc'. Мы также создаем новый скин, который будет работать с l10n, поэтому у нас есть длинная ветка темы 'skin'.

Мы хотели бы иметь отдельные ветви для каждой, но проблема в том, что эти две функции перепутаны. Когда вы выполняете работу, длина переведенных сообщений и других вещей влияет на скин. Аналогично, если вы вносите изменения в скин, это может потребовать некоторых модификаций сообщений или других функций l10n. С другой стороны: когда мы вносим изменения в «loc» и хотим протестировать, нам нужна последняя рабочая копия «skin», и наоборот.

Итак, как лучше всего справиться с этой ситуацией - мы просто используем одну ветку, мы делаем обе ветки входящими в промежуточную ветку 'skin-plus-loc', где мы делаем тесты, затем сливаемся в dev, мы продолжаем слияние возможно, кончики двух ветвей друг в друга? или мы продолжаем сливать dev в них? Как лучше всего обращаться с таким делом.

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Филиалы служат многим полезным целям, но для этого обсуждения я собираюсь разделить их на две категории:

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

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

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

Позвольте мне сделать вид, что я прав в приведенной выше оценке, и наметить стратегию для вас:

Решение: перебазировать ветку исправления ошибок

Это решение является оптимальным при условии соблюдения следующих условий:

  • Перебазирование возможно и разрешено. Если над веткой работает только один разработчик, это разрешено по умолчанию. Однако, если есть несколько разработчиков, может быть опасно использовать перебазирование, если вы не можете гарантировать, что перебазирование всегда будет тривиальным.

  • Ветка исправлений остается "чистой" как можно чаще. Сайт должен быть собран из любой точки ветки исправления ошибок. Если разработка слишком нестабильна, чтобы допустить это, это не очень хорошее решение.

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

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

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

Проблема: переназначение невозможно / разрешено

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

Чтобы избежать этой проблемы, вам следует рассмотреть возможность использования веток меньшей области видимости; вместо ветки локализации используйте ветку темы "localize personal settings" и ветку исправления ошибок "localization plumbing". Мотивация заключается в том, чтобы соответствовать условиям решения, описанного выше: небольшие ветки могут быть обработаны одним разработчиком, небольшие ветки, как правило, легче перебазировать, а небольшие функции могут быть завершены и предоставлены быстрее, чем большие.

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

Проблема: ветвь исправления не чистая, или зависит от ветви функции

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

Ветви должны иметь четкое назначение и продолжительность жизни. Если ветвь начинает преследовать несколько целей, преимущества использования контроля версий уменьшаются. Лучше иметь две или три тонко настроенных ветви, чем одну нечеткую.

В сторону: почему повторное слияние плохо

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

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

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

1 голос
/ 24 февраля 2012

См. " Когда вы должны перейти ".

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

Если ваши две задачи (скин и локализация) тесно связаны, они должны находиться в одной ветви. И отдельно от dev ветки.

...