Как легко перебазировать все зависимые ветки, если я сменил одну из веток, от которой они зависят? - PullRequest
1 голос
/ 28 октября 2011

Я пытаюсь найти хорошее решение, используя git для гибкого управления большим проектом для разных платформ, клиентов, функций ...

В качестве простого примера (чтобы понять, что это за мойпроблема, но в действительности это будет более сложным) предположим, что у меня есть основная ветка, где я добавляю все общий источник.Из него я создаю ветки для разных операционных систем, таких как win (для Windows), gnu (для GNU) и т. Д., И ветки для любой функции, которая может потребоваться клиенту или нет (для простоты я называю их client_a и client_b).

* client_b
| * client_a
|/
| * gnu
|/
| * win
|/
* master

Таким образом, если один клиент требует приложения, работающего в Windows, с функциями, которые я сделал в ветви client_b, я мог бы создать ветку (winB) из ветви win как:

git checkout -b winB
git merge client_b

Эта новая ветка будет содержать все функции, включенные в client_b, и будет готова для создания приложения Win, по крайней мере, это мое намерение.Проблема заключается в том, что, если я хочу исправить ошибку или добавить больше кода в ветку client_b и хочу, чтобы winB и все другие ветви, в зависимости от client_b, получали и эти изменения, я должен идти по очереди, делая что-то вроде этого (это конкретный случай для winB)

git rebase client_b
git merge win

Обратите внимание, что это даже хуже, когда мне нужно добавить что-то новое в мастер, где все зависит от!Итак, мой вопрос, при таком сценарии, как бы вы справились с управлением этими ветками и легко обновляли результаты слияний (в нашем случае winB), не перебирая и не объединяя одну из этих ветвей снова?Предложения по другим лучшим сценариям для достижения этой цели также приветствуются.

Заранее спасибо!

1 Ответ

0 голосов
/ 29 октября 2011

У вас есть несколько вариантов.

Во-первых, если ветви кода клиента используются где-то еще (кто-то другой кодирует их), то вам не следует использовать rebase.rebase переписывает историю, включая SHA1, и может вызвать много горя, если другие люди полагаются на историю.

Первый вариант - создать исправления функции и применить их к веткам, для которых требуется функция.в.

Второй - вишня, чтобы выбрать коммиты в ветвях, где вы хотите.

Третий - просто объединить изменения, хотя это не сработает, если некоторые из вашихветки отошли от главного для включения локальной функции (например, для Windows).

Я бы выбрал патч или вишню и напишу скрипт, который позволит автоматизировать этот процесс для конкретной ветви или группы ветвей.

Например:

apply_patches_for_win windows-feature.patch

или

cherry_pick_for_win commit_SHA1

Вы также можете написать скрипт для перебазирования ветвей,если rebase все еще лучший вариант.

...