Как поделиться новыми git ветвями между двумя разными ветвями? - PullRequest
2 голосов
/ 05 марта 2020

У меня есть репо, в котором у меня есть две основные ветви (одна из них - пользовательская версия стандартного продукта, а другая - стандарт). Они разделяют примерно 90-95% кода, но между ними есть существенные различия.

Каков наилучший способ создания новых функций, которые я могу объединить в обе эти ветви?

Наверх до сих пор я запускал новые ветви из одной или другой из основных ветвей, а потом вишня врывался в другую ... но это начинает быть болью. И дерево git выглядит так: sh! T: (

Если я объединю ветви, получающая ветка будет повреждена и у нее будет масса конфликтов, поэтому я использую cherry-pick .

Есть ли хороший рабочий процесс для чего-то подобного? Должен быть лучший способ. Причина, по которой у меня есть две основные ветви, состоит в том, что почти весь код идентичен, но есть незначительные, но существенные, различия между основными ветвями.

1 Ответ

1 голос
/ 07 марта 2020

Представьте на секунду, что одна постоянная ветвь «новее», чем другая, как ветвь с новыми функциями F против ветвь с исправлением ошибок B . (Если одна из ваших ветвей имеет больше уникального кода, чем другая, для этого назовите его F , чтобы минимизировать необходимость объединения в обоих направлениях.) Затем, если изменение применяется к обоим , это по определению будет исправлением ошибки, поэтому вы примените его к B и позже объедините B в F , разрешив любые конфликты, возникшие из-за новые функции изменили соответствующий код.

Эта модель также работает и здесь (особенно если почти все новые изменения применяются к обеим версиям и могут быть внесены сначала в B ), но есть проблема: в первый раз, когда вы объединитесь, вы попытаетесь внести все нежелательные различия между F и B в F . Поэтому сделайте сначала подделку : объедините B в F , но на самом деле не измените F . Тогда только new работают над B ( т.е. , те самые «новые функции», о которых вы спрашивали) имеют право на объединение, что вам и нужно.

Поддельное слияние может быть создано следующим образом (с использованием только кроссплатформенных функций оболочки):

# create cmt with a message for the fake merge
git commit-tree F: -p F -p B <cmt
# use the hash it prints below
git checkout F
git merge $HASH

Слияние будет ускоренным, поскольку commit-tree основывалось на F .

...