2017-02-03 7 views
0

Мы используем ветви для функций, которые затем объединяем в master. Мы также используем ветви для версий. Однако у меня есть определенная функция (объединенная в master), которая должна войти в ветвь версии. Раньше я использовал cherry-pick для этого (ручная выщипывание фиксируется по одному), но у этой функции слишком много фиксаций, чтобы делать по одному. Есть ли способ лучше?Объединить функции в Git в другой ветке?

Эта функция уже слита в master. Филиал больше не существует локально. Тем не менее, у меня есть фиксация, которая возникла в результате объединения ее в master.

Я могу восстановить feature-branch (так как мы используем GitHub). Однако из ветки версии, когда я запускаю git merge feature-branch, я получаю всевозможные конфликты, не связанные с этой функцией. То же самое происходит, если я делаю git rebase feature-branch (от version-branch).

+0

Связано ли это с хозяином и нажато на пульте дистанционного управления или все это локально? – castis

+0

См. Мое обновление @castis –

ответ

1

Ваша история может выглядеть примерно так:

*--*--X--Y---------------* [master] 
    \  \   /
    \  *--*--*--*--A [formerly feature-branch] 
     \ 
     *--*--* [version-branch] 

Легкая часть становится feature-branch обратно; просто выяснить фиксации хэш A и сделать:

git checkout -b feature-branch A 

Однако, если version-branch ответвляется от masterдо тогоfeature-branch сделал (как показано выше), вы не хотите, чтобы сделать прямой git merge или git rebase, т.к. что также приведет к совершению сделок X и Y. Вместо этого сделать --onto перебазироваться:

git rebase --onto version-branch Y feature-branch 

Чтобы сделать его легче найти Y, вы можете сделать:

git merge-base master feature-branch 

Или все в одной команде:

git rebase --onto version-branch $(git merge-base master feature-branch) feature-branch 

После перебазироваться является в целом, вы можете объединиться в version-branch, как обычно.


Если вы получаете какой-либо конфликтов слияния во время перебазирования (или если version-branch ответвляется master во время или после feature-branch сделал, и вы все еще получаете конфликты), то вам придется иметь дело с ними, потому что это означает, что конфликты находятся между суммами в feature-branch, а фиксация - version-branch.

+0

Можете ли вы также сделать git cherry-pick -m 1 'где' MC' - это слияние, которое привносит 'feature-branch' в' master'? – frans

+0

@frans: Я не уверен в верхней части головы, но это не помешает попробовать. –

0

Вы получите конфликты слияния в ветви версии, потому что ветвь функции была основана на ветке master и (более старой) версии, имеет различную историю (вишня выбрала коммиты, слияния и т. Д.). В вашей текущей ветви функции будут добавлены дополнительные коммиты от других несвязанных функций, если она основана на главном. Поэтому я ожидаю, что будет много тяжелой работы по разрешению конфликтов.

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

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

Я предлагаю создать разные хранилища для версий (вилок), а не использовать ветви для управления версиями. Это упрощает обслуживание. Чтобы применить эту функцию к другой версии, нажмите ее после завершения реализации в репозиторий вашей целевой версии в ветви функции. Затем вы можете внести необходимые изменения в код, разрешить конфликты и т. Д. И объединить его с мастером вашего репо.

Надеюсь, что это поможет.

Смежные вопросы