Синхронизация изменений в нескольких ветках, как сделать?
Существует некий проект, который использует GIT. До некоторого времени там была одна ветка, которая просто пушилась на гитхаб, и на локальный сервер.
Теперь в проекте появились некоторые модули, которые мы не хотим выкладывать в общий доступ, однако, хотим продолжать выкладывать на гитхаб исправления существующих глюков и новые фичи.
Дело осложняется тем, что в локальной develop-ветке хочется коммитить чаще — после каждого серьезного исправления, так легче отслеживать, на каком исправлении что-то сломалось, или возвращаться к предыдущей версии кода. Однако, на гитхаб и локальный сервер лучше отправлять большие коммиты с уже готовыми функциями — так людям со стороны проще отслеживать, что изменилось.
Итого, у нас получается три сущности — develop-ветка, в которую попадают любые изменения, stable-local, в которой лежит весь код, но в которой коммиты выглядят как "сделал новую фичу", в отличии от "убрал переменную, переписал функцию, поправил стиль кода тут" в develop, и stable-public, где все тоже самое, но часть коммитов из stable-local туда не попадают.
Как это сделать проще/лучше?
Поддерживать два девелопа (публичный и приватный, который никогда не мержить в публичный). Соотвественно, в гитхаб отправлять только публичный. Ведь общий код у них будет общий, а коммиты под вашу "суперфичу" не должны никак аффектить общий код.
То есть:
делаем бранч под фичу для суперфичи - сливаем в приватный девелоп;
делаем общий функционал/фиксим общий баг - мержим его бранч в публичный девелоп, а его - в приватный девелоп.
коммиты выглядят как "сделал новую фичу", в отличии от "убрал переменную, переписал функцию, поправил стиль кода тут"
Укротить приступы спонтанного перфекционизма и делать плановые рефакторинги в отдельных ветках или в фичебранчах еще до того, как фича мержится в девелоп. Подобные вещи должны пресекаться обязательными код-ревью перед любыми мержами в девелоп.
Если чуть более развёрнуто: в devel коммитишь сколько влезет, когда сливаешь в stable-local делаешь rebase devel относительно stable-local + squash(суть объединяешь кучу мелких в один) лишних коммитов и мержишь, в stable-public делаешь уже cherry-pick того что должно уехать в паблик.
Либо другой вариант: держишь stable-public как основную ветку и всё вышесказанное делаешь относительно неё, а stable-local с non-public модулями регулярно ребейзишь относительно stable-public.
Третий вариант: вынести non-public в отдельный репозиторий и пользоваться submodules/subtrees