Ответ
Мы применяли адаптированную версию Git Flow с долгоживущими ветками для разных этапов разработки.
Основные ветки:
main/master— стабильная ветка, соответствующая продакшену. Код только через мерж-реквесты.develop— ветка для интеграции новых функций. Основная ветка для разработки.- *`feature/
** — короткоживущие ветки для разработки новой функциональности. Ответвляются отdevelop`. - *`release/
** — ветки для подготовки релиза (финальное тестирование, исправление багов). Ответвляются отdevelop`. - *`hotfix/
** — ветки для срочных исправлений в продакшене. Ответвляются отmain`.
Типичный workflow для новой функции:
# Создание ветки для задачи
git checkout develop
git pull origin develop
git checkout -b feature/JIRA-123-new-login-button
# После завершения разработки и тестов
git push origin feature/JIRA-123-new-login-button
# Далее создается Pull/Merge Request из feature/* в develop
Для хотфикса:
git checkout main
git pull origin main
git checkout -b hotfix/critical-payment-fix
# Исправление бага, тесты
git push origin hotfix/critical-payment-fix
# MR в main, затем обязательный мерж в develop
Эта стратегия обеспечивала стабильность main и контролируемый поток изменений.
Ответ 18+ 🔞
А, вот эта ваша хуйня с гитом, про которую все так пиздят! Мы тоже в своё время на эту удочку попались, блядь. Использовали такую адаптированную версию Git Flow, ну, с этими ебучьми долгоживущими ветками для всяких этапов. Вроде как строго и по науке, а на деле — иногда такой бюрократический пиздец, что волосы дыбом, но в целом, если команда не из распиздяев, то работает.
Вот наши главные ветки, на которых всё держалось:
main/master— это, блядь, священная корова. Там код, который уже на проде и не дохнет (в идеале). Туда можно только через мерж-реквест, и чтобы у тебя уже все тесты прошли и три старших товарища подписались, иначе — иди нахуй.develop— тут уже веселее, тут весь сырой, горячий, только что из-под пальцев код. Сюда стекается вся новая функциональность, тут ад интеграции, но это сердце разработки.- *`feature/
** — это как личный песочник для каждой фичи. Хочешь новую кнопку — отпочкуйся отdevelop` и ваяй, пока начальство не пришло с криками "где результат, блядь?". Короткоживущие, чтоб не превращались в отдельную вселенную. - *`release/
** — а вот это уже нервотрёпка. Когда вdevelop` накопилось дохуя всего и надо готовить релиз. Ответвляешься, финализируешь, тестируешь, баги чинишь, ищешь виноватых — стандартный набор. - *`hotfix/
** — мой любимый, ёпта. Когда на проде всё горит синим пламенем и клиенты орут. Ты, блядь, с утра пораньше, ещё с похмелья, отпочковываешься прямо отmain`, быстренько латаешь дыру и пушишь, как угорелый. Спасение утопающих — дело рук самих утопающих.
Ну и как это примерно выглядело в жизни, когда надо было фичу запилить:
# Приходишь с утра, кофе ещё не пил
git checkout develop
git pull origin develop # чтобы не было потом "ой, у меня конфликты, бля"
git checkout -b feature/JIRA-123-new-login-button # и понеслась
# ... Проходит N часов/дней, фича готова, локально всё работает (надеюсь)
git push origin feature/JIRA-123-new-login-button
# А дальше самое интересное — создаёшь Pull/Merge Request из своей feature/* в develop и начинаешь молиться, чтобы ревьюверы не нашли, за что зацепиться.
А вот если пиздец на проде и надо хотфикс:
# Понимаешь, что день уже не задался
git checkout main
git pull origin main # очень важно, блядь, не забыть!
git checkout -b hotfix/critical-payment-fix # название говорит само за себя
# Тут ты в режиме ниндзя исправляешь одну строчку, которая всё ломала
git push origin hotfix/critical-payment-fix
# MR в main делается в три раза быстрее, потому что всем похуй на процесс, лишь бы продакшен не лёг. И ОБЯЗАТЕЛЬНО потом этот фикс назад в develop мержишь, а то потом вылезет, как хитрая жопа, через полгода.
В общем, стратегия такая, да. Сохраняет main в относительной чистоте и даёт хоть какую-то иллюзию контроля над этим потоком изменений. А так-то, конечно, всё упирается в то, чтобы люди не были мудаками и делали всё по уму, а не абы как.