Работаете в ветке
dev, периодически вливая ее в
master. Для крупных задач (не входящих в один коммит) делаете отдельные ветви из
dev.
Вливая
dev в
master, делаете это с ключом
--squash как то так:
git checkout master
git merge --squash dev
Тут теоретически могут быть конфликты, если вы делали коммиты в
masterпараллельно с
dev, которые вам надо разрешить, а после уже добавляете и делаете один большой коммит:
git add -A
git commit -m "Merged dev: %кратко (или нет) основные изменения%"
git push
А чтобы не мозолили глаз висящие коммиты с логической незавершенностью, их можно сливать их перед
merge с помощью интерактивного
rebase:
git checkout dev
git rebase -i master
Откроется редактор, в котором будет список коммитов ветки
dev. Здесь можете слепить ненавистные коммиты с помощью команды
squash (и тогда вам предложат отредактировать сообщение) или
fixup (тут не предложат) и потом сделать
git push --force (для одного не критично, в толпе лучше использовать
--force-with-lease.
Или есть еще вариант - лепить к предыдущему коммиту сразу с помощью
git commit --amend
Ну и после
merge уже можете на
master лейбл версии повесить.