В моей команде возникла жестка дискуссия о том нужно ли запрещать делать push'ы в мастера с ключем force на уровне репозитория.
Наш производственный процесс выглядит следующим образом. Когда девелопер берет себе очередной таск, он создает себе отдельную ветку, которая отбита от актуального мастера. Как только таск закончен у нас необходимо создать merge request, который должен просмотреть кто-то из команды. Если все в порядке, то ветка сливается с мастером и удаляется. Мы используем гитлаб, который позволяет слить ветку с мастером по одному клику.
Однажды в мастера попала ветка, которая там быть еще не должна. Так вышло, что висел merge request к которому были замечания, но человек, который просматривал код кликнул не в том месте, где нужно было и слил незаконченную ветку с мастером. Сразу же был сделан реверт, который по сути представляет собой коммит, уничтожающий предыдущий merge. Этот самый реверт спровоцировал пару проблем. В итоге было сделано следующее -- этот самый случайный merge был "вырезан", после чего последовала страшная команда
git push origin master --force-with-lease
.
На мой взгляд данное решение было оправдано потому, что:
- В истории версий не будет мусора. Действительно -- только что вошел merge по неосторожности, сверху на него упал реверс-коммит. Но через час, как только будут заимплементированы вещи, которые появились после ревью, будет сделан еще один merge с той лишь разницей, что он будет на несколько коммитов больше. В итоге имеем кучу ненужного в истории кода.
- В нашем конкретном случае если не вырезать неудачный merge, то в конечном итоге после имплементации замечаний пришлось бы делать rebase на актуального мастера (в котором уже был реверс-коммит) и это создало бы кучу конфликтов, которые пришлось бы развязывать.
На мой взгляд данное решение было более, чем оправдано, тем не менее начался холивар.
Вопросы:- Кто как считает -- нужно ли отключать возможность push'а с форсом?
- Что у Вас делают если в мастера случайно попало что-то, чего там быть не должно?