Обзоры основных стратегий:

feature/* → develop squash merge release/* → main обычный --no-ff merge release/* → develop обычный --no-ff merge hotfix/* → main обычный --no-ff merge hotfix/* → develop обычный --no-ff merge
feature/* → developgit switch develop git merge --squash feature/my-feature git commit -m "Add my feature" git branch -D feature/my-feature git push origin --delete feature/my-feature
Squash слияние не создаёт merge-коммит автоматически. Оно переносит все изменения из feature/my-feature в рабочее дерево и индекс, после чего требуется самостоятельно сделать обычный коммит. Для feature/fix-веток, которые вливаются через squash, удаление через -D - это ожидаемая ситуация.
develop полностью подготовить код проекта к релизу и зафиксировать последние правки коммитом.develop создать релизную ветку release/X.Y.Z:git switch -c release/X.Y.Z
CMakeLists.txt:vim CMakeLists.txt
debian/changelog:./scripts/make-deb-changelog.sh
release/X.Y.Z сделать коммит с фиксацией результатов подготовки к релизу Prepare release X.Y.Zgit commit -a -m "Prepare release X.Y.Z"
main:git switch main git merge --no-ff release/X.Y.Z
Рекомендуемое название коммита Release X.Y.Z
main на сервер:git push
git tag -a vX.Y.Z -m "Release X.Y.Z"
Метка устанавливается до переключения на ветку develop,
git push origin vX.Y.Z
develop.:git switch develop git merge --no-ff release/X.Y.Z
При этом рекомендуется название коммита по умолчаниюMerge branch «release/X.Y.Z» into develop, чтобы различать истинный релиз в ветке main и обратное слияние из release/X.Y.Z в develop.
develop на сервер:git push
release/X.Y.Z:git branch -d release/X.Y.Z