TLDR: rebase + squash + cherry-pick
Если чуть более развёрнуто: в devel коммитишь сколько влезет, когда сливаешь в stable-local делаешь rebase devel относительно stable-local + squash(суть объединяешь кучу мелких в один) лишних коммитов и мержишь, в stable-public делаешь уже cherry-pick того что должно уехать в паблик.
Либо другой вариант: держишь stable-public как основную ветку и всё вышесказанное делаешь относительно неё, а stable-local с non-public модулями регулярно ребейзишь относительно stable-public.
Третий вариант: вынести non-public в отдельный репозиторий и пользоваться submodules/subtrees