Ответ 1
Если только вы работаете в своей ветке feature2
, и вы не поделились ею с другими людьми, прекрасно сменить эту ветвь перед слиянием. Вы можете сделать следующее, например:
git checkout feature2
git rebase --onto master feature1 feature2
..., который перепишет вашу ветвь feature2
, оставив ее так, чтобы она состояла из всех коммитов в feature2
, так как она была разветвлена с feature1
, но была повторно применена на master
. Я предлагаю вам использовать gitk --all
или аналогичный git просмотрщик истории впоследствии, чтобы проверить, что результат этой операции является тем, что вы хотите.
Кстати, это как раз сценарий, используемый для объяснения --onto
в git rebase
документации - см. начало абзаца:
Вот как вы пересадили ветвь темы на основе одной ветки на другую, чтобы притворяться, что вы разветкили ветвь темы из последней ветки, используя rebase -onto. [...]
Обновлено в ответ на большее количество материала в вопросе:
Начиная с вашей истории, которая выглядит так:
A - B - C - D - - - - - - - - - - - - - L - M master
|
| - I - J - K feature2
\ / \
- E - F - G - H - - - - - -N - O - P feature1
Вы можете получить то, что хотите, выполнив следующие действия:
git checkout feature2
git rebase --onto D H feature2
Это оставит вас с историей, которая выглядит так:
A - B - C - D - - - - - - - - - - - - - - - - - - - L - M master
|\
| \ - I' J' K' feature2 I - J - K
\ / \
- - - - - - - E - F - G - H - - - - - -N - O - P feature1
Перед созданием слияния, которое вы хотите в feature1
, вы должны указать SHA1sum O
и P
. (Я предполагаю, что N
- это просто нормальное слияние, а не "слияние зла".)
Затем сделайте жесткий reset, чтобы переместить функцию1 обратно в H
:
git checkout feature1
git rest --hard H
Затем вы должны иметь историю:
A - B - C - D - - - - - - - - - - - - - - - - - - - L - M master
|\
| \ - I' J' K' feature2
\
- - - - - - - E - F - G - H feature1
Теперь вы, очевидно, хотите объединить K'
в feature1
:
git merge K'
A - B - C - D - - - - - - - - - - - - - - - - - - - L - M master
|\
| \ - I' - J' - - - - - - - K' feature2
\ \
- - - - - - - E - F - G - H - Z feature1
И, наконец, вы можете вишнево выбрать старые O
и P
на feature1
с помощью:
git cherry-pick O
git cherry-pick P
... оставить:
A - B - C - D - - - - - - - - - - - - - - - - - - - L - M master
|\
| \ - I' - J' - - - - - - - K' feature2
\ \
- - - - - - - E - F - G - H - Z - - O' - P' feature1