LINUX.ORG.RU

git и бакгфикс релизы

 


3

3

Обычная история: имеем одну мастер ветку, к которой привязаны теги/релизы. Публикуем релиз и начинаем заливать новый код. Вдруг оказывается, что нужно выложить багфикс релиз без новых изменений. Как это лучше организовать?

Очевидный ответ - git-flow. Но он больно сложный, особенно для простых репозиториев и маленькой команды.

Альтернативное решение - stable ветка. То есть master - это у нас develop (в терминологии git-flow), а stable содержит сами релизы.

Соответственно, когда нам нужно сделать хотфикс - мы создаем ветку от stable, фиксим баг, а затем сливаем её со stable и master.

Когда в master набирается достаточно изменений - сливаем их со stable и ставим тег/публикуем релиз.

Какие подводные камни у данного метода? Некоторые советуют по-прежнему использовать merge --no-ff, но я так и не понял какой от него толк, только коммиты засоряет. А хотелось бы, чтобы stable был зеркальной копией master, только «старой».

PS: использую git уже нацать лет, а он по прежнему как чёрный ящик.

★★★★★

Последнее исправление: RazrFalcon (всего исправлений: 1)

новая ветка от тега, багфикс в ветке, выпуск нового тега, слить багафикс в мастер

anonymous
()

Не нужно всё усложнять. Не нужны ради одного хотфикса никакие извращения типа stable ветки и git flow. Это пережитки недоVCS, которые в git только замусоривают историю и путают контрибуторов.

Есть у тебя релиз X.Y.Z с багой - так отведи от него ветку, черри-пикни туда коммит с фиксом и сделай там тэг X.Y.Z.1 или X.Y.(Z+1), вот и весь тебе готовый релиз с хотфиксом. Если не хочешь чтобы у тебя болталась эта ветка, вмержи её обратно в master.

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

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

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

Приучить. Хорошо сказано. Но автоматом лезишь в master. Хоть руки отруби.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

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

Самый распространённый в моей практике кейс - ты забыл/лень было сделать feature ветку и пилишь фичу (у себя) в master. Но пока ты её не push’аешь - пили на здоровье локально.

А когда/если придёт понимание что её разработка затягивается, а нужно срочно выкатывать фиксы - делаешь git commit -am WIP && git branch feature && git reset --hard origin/master - итого вся недоделанная работа остаётся в ветке, локальный master откатывается на стабильное публичное состояние и туда можно спокойно коммитить фиксы, и в любой момент вернуться к ветке.

slovazap ★★★★★
()
Ответ на: комментарий от Deleted

Ну если это откровение то лучше начать с того чтобы освоить инструмент хотя бы на базовом уровне. А то без понимания что делает reset --hard можно и данные потерять.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

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

Дык это тоже самое, что я написал. Только на оборот.

RazrFalcon ★★★★★
() автор топика
Ответ на: комментарий от slovazap

А то без понимания что делает

Не-не. Что делают команды, я прекрасно понял. А вот самому догадаться до такой комбинации не получилось. И ведь простая комбинация то.

Deleted
()
Ответ на: комментарий от slovazap

Я прочёл «ветке», а не «ветках». Но тогда не понятно что подразумевается под стабильным master. Сливать feature ветки только перед релизом или как? Ведь фича может зависеть от другой и тд. Разрабатывать их все параллельно - бред.

RazrFalcon ★★★★★
() автор топика

Мы с чуваками делаем master для нового релиза и release/x.y, где багфиксы для продакшона. Обычно держим компат для двух релизов назад.

kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

У нас по ветке на каждый мажорный, а багфикс релизы для них там же. То есть ветка release/1.11 содержит от 1.11 до 1.11.15. Релизы, разумеется, тегированные.

kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 1)

На паре проектов использовали упрощенный вариант git-flow, для нас работало нормально. На проектах было от 1-2 до 5 человек.
* master — стабильная прод-версия
* develop — ветка для разработки, куда льются pull requestы
* при релизе сливаем develop в master и с него релизим.
* В случае hot-fix делаем ветку с master и в него же льем pull request. Делаем релиз с master.
* периодически (по надобности) подливаем master назад в develop. Если нет hot-fixов то и подливать не нужно.

urxvt ★★★★★
()
Ответ на: комментарий от RazrFalcon

Я прочёл «ветке», а не «ветках». Но тогда не понятно что подразумевается под стабильным master. Сливать feature ветки только перед релизом или как?

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

Ведь фича может зависеть от другой и тд. Разрабатывать их все параллельно - бред.

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

Тут как-бы все возможности git к вашим услугам: хотите - разрабатывайте связанные фичи в одной ветке, хотите - вливайте одну ветку в другую, хотите - ребейзите, хотите - разрабатывайте в параллельных ветках и периодически синхронизируйтесь, хотите - не синхронизируйтесь, хотите - синхронизируйтесь при этом с мастером, хотите - нет. Вообще, вы можете делать всё что делали бы в мастере, смысл только в том чтобы не делать это в мастере, оставив возможность выкатывать в него готовые фичи и фиксы.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

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

Но для жирных проектов отдельные ветки будут удобнее, да.

RazrFalcon ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

В моём конкретном случае - у меня все фичи строго последовательные

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

Параллельно ничего пилить не выйдет, иначе очень легко всё сломать.

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

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Это говорит о кривой архитектуре.

Если речь про консольную утилиту, которая просто выполняет n заданий последовательно, то нет.

RazrFalcon ★★★★★
() автор топика

использую git уже нацать лет, а он по прежнему как чёрный ящик

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

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 1)

А feature ветки это вообще не про релизы, хотя в git flow их умудряются притянуть туда за уши

annulen ★★★★★
()
Ответ на: комментарий от RazrFalcon

Какая разница какая это утилита? В нормальном ПО каждую функцию, класс или модуль можно менять независимо.

slovazap ★★★★★
()
Ответ на: комментарий от urxvt

Самая адекватная версия git-flow. Только, обычно, master давно заброшен, но существуют ветки типа live/production и stage/staging. Для этих веток есть сервера, а вот develop, по сути, просто лишняя. Как это выглядит:

* новые ветки всегда от live/production

* при завершении работы merge в stage/staging, тестируем

* если всё ок, эту же ветку сливаем с live/production

** если не всё ок (конфликты) делаем rebase on top of live/production (правим конфликты в фичабранче)

* всё же сливаем ветку в live/production

С хотфиксами и так понятно, что это live → hotfix → merge to live → cherry-pick/merge to stage.

conformist ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.