Объединение изменений из ветки на основе ветки темы в другую ветку темы в git - PullRequest
2 голосов
/ 21 апреля 2011

Моя команда работает над веткой общих тем в git, которую я назову "topic1".Я работал над рефакторингом некоторого кода в ветке, созданной по теме1, которую я назову «рефакторинг».Я периодически сливал топик1 в рефакторинг, чтобы я мог быть в курсе изменений, но не реорганизовал рефакторинг обратно в топик1, потому что рефактор все еще находится в процессе.

Есть еще одна ветка темы, которую я будуназовите "topic2", которая была недавно создана от мастера.То, что я хотел бы сделать, это объединить только изменения, которые я сделал в "рефакторе", с новой веткой, созданной из topic2, которую я назову "topic2_refactor".(То есть изменения в коммитах, доступные только по рефакторингу, но не по теме1.)

Я знаю, как увидеть эти только эти изменения:

git log origin/refactor --not origin/topic1

Так что я хотел бы сделатьэто что-то вроде этого - но этот синтаксис не является правильным:

git checkout topic2
git checkout -b topic2_refactor

А затем это:

git merge origin/refactor --not origin/topic1

Или это:

 git cherry-pick origin/refactor --not origin/topic1

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

Я надеялся, что есть чистый способ сделать это и избежатьненужные конфликты слияний, которые были разрешены позже в истории ветки «рефакторинг».Может ли это быть возможно с помощью git rebase, git filter-branch и т. Д.?

1 Ответ

2 голосов
/ 21 апреля 2011

Вы можете попробовать git rebase с опцией - на .Это позволяет для операции rebase захватывать различия, которые необходимо применить, из вашей ветви 'refactor', основанной на 'topic1', но затем применять их к 'topic2'

git co refactor
git co -b topic2_refactor
git rebase --onto topic2 topic1 # bases the diffs off of topic1, but applies them to topic2

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

Тогда вы можете столкнуться с проблемами, когда theme1 и topic2 (после рефакторинга) необходимо снова объединить с master, поскольку у них будут все эти идентичные коммиты рефакторинга.Хотя git обычно неплохо справляется с этим.

Поскольку кажется, что рефакторинг не зависит от этих веток тем, я хотел бы рассмотреть вопрос об удалении ветки рефакторинга от master, поэтому вы можете объединить эти изменения в обе темы,рефакторинг завершен.

...