MagnetonBora
@MagnetonBora

Нужно ли запрещать git push origin master -f на уровне репозитория?

В моей команде возникла жестка дискуссия о том нужно ли запрещать делать push'ы в мастера с ключем force на уровне репозитория.

Наш производственный процесс выглядит следующим образом. Когда девелопер берет себе очередной таск, он создает себе отдельную ветку, которая отбита от актуального мастера. Как только таск закончен у нас необходимо создать merge request, который должен просмотреть кто-то из команды. Если все в порядке, то ветка сливается с мастером и удаляется. Мы используем гитлаб, который позволяет слить ветку с мастером по одному клику.

Однажды в мастера попала ветка, которая там быть еще не должна. Так вышло, что висел merge request к которому были замечания, но человек, который просматривал код кликнул не в том месте, где нужно было и слил незаконченную ветку с мастером. Сразу же был сделан реверт, который по сути представляет собой коммит, уничтожающий предыдущий merge. Этот самый реверт спровоцировал пару проблем. В итоге было сделано следующее -- этот самый случайный merge был "вырезан", после чего последовала страшная команда git push origin master --force-with-lease.

На мой взгляд данное решение было оправдано потому, что:

  1. В истории версий не будет мусора. Действительно -- только что вошел merge по неосторожности, сверху на него упал реверс-коммит. Но через час, как только будут заимплементированы вещи, которые появились после ревью, будет сделан еще один merge с той лишь разницей, что он будет на несколько коммитов больше. В итоге имеем кучу ненужного в истории кода.
  2. В нашем конкретном случае если не вырезать неудачный merge, то в конечном итоге после имплементации замечаний пришлось бы делать rebase на актуального мастера (в котором уже был реверс-коммит) и это создало бы кучу конфликтов, которые пришлось бы развязывать.


На мой взгляд данное решение было более, чем оправдано, тем не менее начался холивар.

Вопросы:
  1. Кто как считает -- нужно ли отключать возможность push'а с форсом?
  2. Что у Вас делают если в мастера случайно попало что-то, чего там быть не должно?
  • Вопрос задан
  • 2360 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
1. Перезапись истории нужна, но ее нужно использовать осторожно. Пуш с форсом в мастер - исключение из правил, и в вашей ситуации это полностью оправдано.

2. В 99% случаев спасает реверт. В остальных случаях - push --force, но это крайне редко.

В целом я фанат rebase-ов, что бы история гита была линейной. Если фичабрэнч не fast forward то ребейзимся на мастер и перезаписываем историю этой ветки. Ну а далее fast-forward merge (а еще лучше - сквошить коммиты перед этим). Но тут могут быть несогласные, потому использую те варианты которые приняты в команде.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@guras256
На мой взгляд разработку следует вести в ветке develop (как ни странно). Таким образом единственный способ попадания кода в master - слив текущего develop в master.
Таким образом в master всегда будет готовый, рабочий, вылизанный релиз, в то время как текущая разработка ведется в develop.

Что касается вопроса
1. запретить прямой push в master по хорошему надо, но когда возникнет форс мажор и нужно будет срочно что-то вкатить, один хрен полезете включать возможность пуша)
2. реверт делают, что тут еще делать)
Ответ написан
index0h
@index0h
PHP, Golang. https://github.com/index0h
История коммитов на то и история, что бы отображать все изменения в хронологическом порядке.

нужно ли отключать возможность push'а с форсом?

Git push должен быть запрещен, по своей сути - это Домоклов меч, только над головами всей команды.
Несколько раз встречал форсированные пуши после не удачного ребейза. Один раз за коллегой пришлось восстанавливать 2-х недельную историю, не самое приятное занятие.

Что у Вас делают если в мастера случайно попало что-то, чего там быть не должно?

revert + комментарий в баг трекере о причине реверта.

На прошлом проекте релизы были 1 раз утром и опционально днем. Релиз проводился в полу автоматическом режиме, ветки затягивались из багтрекера, а далее намердживались на мастер. В случае конфликта - автоматический реверт. В случае поломки сборки - ручной поиск виновника и ручной реверт.
Форсированный пуш не нужен. Ребейз при этом не прижился.
Да, факапы бывали, для этого и были опциональные релизы днем, что бы автор увидев свой косяк на проде мог в тот же день его асапно исправить.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы