Search
Write a publication
Pull to refresh

Comments 16

git rebase — это плохо. Теряется контекст разработки, затрудняется работа git bisect и т. п.

Гм. А без rebase порядок комитов перестает быть хронологическим. И с rebase и без есть проблемы.
Конечно ребейз на «публичных» ветках делать плохо и не потому что теряется контект разработки (даже напротив — история становится чище), а просто потому что приходится делать форс пуши. Они в свою очередь плохи тем, что позволяют менять историю коммитов (удалять, расщеплять, объединять их и т.п.), что может приводить к сложным конфликтам при дальнейшем протаскивании изменений «наверх».

Поэтому в этой схеме есть некоторые ограничения: 1) при ребейзе нельзя входить в интерактивный режим и вручную править коммиты (ребейз используется только для изменения основы ветки); 2) обновлением основных веток занимается один человек — мейнтейнер проекта (члены команды работают только с dev веткой).

Таким образом использование rebase в этой схеме безопасно.
Вроде есть устоявшаяся терминология, что bugfix это до релиза и hotfix — после. Как-то сбивает с толку, когда hotfix появляется из dev ветки. Взять даже эту картинку из каноничного http://nvie.com/posts/a-successful-git-branching-model/
Hotfix
image
1. Название bugfix подразумевает наличие какого-то бага, а hotfix — срочную правку, что больше подходит для этой схемы. От противного: для внесения изменения (не исправление бага) на beta стенд, потребуется создать bugfix ветку.

2. Поскольку отличий с точки зрения процесса принятия изменений, в одну из основных веток, между bugfix и hotfix ветками нет (тесты запускаются одни и те же, правила мержа те же), то также нет смысла именовать ветки по разному (в зависимости от того куда они будут сливаться).

3. Непонятно как называть фикс-ветки (bugfix или hotfix), если они создаются для beta ветки (она же также релизится).
1. fix подразумевает исправление ошибки, bugfix — плановое, hotfix — срочное, немедленное

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

3. hot подразумевает правку по живому, без прохождения полного цикла тестирования и приёмки, так что годится только для прода.

UFO landed and left these words here
На бета стенде используется боевая база данных или специальная для бета стенда? Если да, то как решается проблема разных схем данных в БД для бета и прод стендов?
Отличный вопрос. У нас на бете сейчас используется продовская БД. Мы (фронтенд) выпускаем бету только после того как бекенд зарелизится. Наличие отдельной БД для бета стенда — задача нетривиальная. Мы её еще не решили.
А бета стенда бекенда нет?

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

Если beta БД использовалась бы только для чтения или не синхронизировалась бы с продовской, ваше предложение подошло бы.


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


Предположительно оба стенда должны писать одновременно в обе базы данных, но здесь есть ряд проблем:


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


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


  3. Поскольку обе БД являются master (обеспечивают read-write доступ) в случае выхода из строя какой-то из них возможны потери данных.

Возможно есть и другие проблемы.

Тогда нужно использовать практики database zero downtime deploy и bluegreen deploy на одной базе. В частности создавать промежуточный код и схемы БД, которые не будут валить прод, но позволят работать и бете, а бета должна работать с промежуточной схемой полноценно. Ну и весь код должен писаться так, что наличие неизвестных полей в таблицах не должно валить его. Тогда деплой беты в прод будет примерно на такие этапы делиться (исходная точка — одна рабочая версия кода и на проде, и на бете, общая БД):
— деплоим промежуточную схему БД для новой фичи
— деплоим промежуточный код на бету
— деплоим промежуточный код на прод
— деплоим конечный код на бету
— деплоим конечный код на прод
— деплоим конечную схему БД

Естественно, после каждого деплоя всё тестим и откатываемся если что не так.

Не уверен, что правильно понял проблему. Бета стенд — это полноценный прод только следующей версии для предоставления раннего доступа к новому функционалу "контрольной" группе пользователей. С него должны уходить сообщения пользователям как с прода. Если нужно протестировать приложение в более-менее реальном окружении нужно использовать dev стенд, предварительно среплецировав данные с прода, как VolCh предлагает делать.

Я правильно понимаю, что при изменениях в ветках справа, у вас ребейзится ветка dev, с которой активно работают разработчики?
Как вы решаете вопрос конфликтов с локальными копиями на машинах разрабов?

Да, при изменении веток справа, мейнтейнер проекта последовательно ребейзит ветки слева до dev. Далее каждый разработчик обновляет (ребейзит) свои feature ветки от dev.


Графически можно представить это следующим образом.


Вносятся изменения в master


Мейнтейнер ребейзит beta от master, затем dev от beta


Разработчики ребейзят свои фичи от dev


Что делает разраб при изменении dev:


  1. Стягивает изменения: git fetch origin
  2. Переходит в feature-ветку: git checkout feature
  3. Ребейзит feature ветку от dev: git rebase origin/feature

Если возникают конфликты он правит только свои коммиты. Т.е. конфликтов не связанных с его фичей здесь быть не может — их все разрешил мейнтейнер, когда ребейзил основные ветки.

Sign up to leave a comment.

Articles