понедельник, 24 января 2011 г.

hg & git. Как унифицировать workflow.

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

Сначала кратко об идеологии данного подхода. Фактически краткий перевод оригинальной статьи.
  • Ветка master (default) содержит только релизы.
  • Ветка develop предназначена для интеграции (содержит готовые фичи, в неё же вливаются багфиксы).
  • Ветки release-* являются freeze-ветка для подготовки к релизу. В момент создания этой ветки в develop должен быть только набор фич, которые войдут в релиз. В конце жизненного цикла ветка вливается в master (default), выпуская релиз. Также эта ветка вливатся в develop, внося багфиксы.
  • Ветки hotfix-* начинаются от релизов и возвращаются в релизную ветку для внесения исправлений. Также ветка вливается в develop.
  • Ветки для разработки новых фич начинаются от develop и возвращаются на неё же.
Картинка отсюда.

В случае git'a всё реализуется очень просто. Ветки легковесные, удалять их по истечению необходимости не проблема. Чего не скажешь о hg, где веток несколько типов.
В mercurial для этих целей подходят две: именованные ветки (named branches) и метки (bookmarks).
Основное отличие в том, что bookmark - легковесная ветка, наиболее близкая к git'овским. Она хранится в репозитории, как указатель на последнюю ревизию. А named branch - пишется в коммит и является его частью.

Подход с именованными ветками обладает тем недостатком, что для того, чтобы не образовывалось много голов надо очень аккуратно сливать и вовремя удалять эти ветки (перед последним слиянием). А поведении bookmark'а более похоже на поведение ветки в git (если проставить свойство track.current = True в разделе [bookmarks] в hgrc). Недостаток - что нельзя слить, если не было коммитов после ответвления. В таком случае можно сделать аналог fast-forward, что не является необходимым поведением. Это происходит из-за того, что bookmarks - всего лишь легкие метки над анонимными ветками.

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