Git: Как объединить маленькую, но очень старую ветку? - PullRequest
7 голосов
/ 10 января 2012

Мы мигрируем из SVN, а также объединяем несколько веток. Чтобы упростить задачу, у нас есть ветвь B, которая была разветвлена ​​давным-давно и имеет небольшую разработку, скажем, 8 измененных файлов из сотен. Между тем на мастере произошли огромные изменения:

A 
|
X---(a few changes)--- B
|
|(hundreds of changes)
|
HEAD/master 

Если я выполняю «git merge master» из ветви, показывается много конфликтов слияния, потому что B и HEAD сейчас сильно отличаются. Но это кажется (наивно, на мой взгляд) неправильным: Б не так далеко от сундука, он просто далек от времени.

Есть ли способ воспользоваться этим фактом? Должен ли я попытаться сначала объединить B обратно в X, а затем оттуда в HEAD? Какими будут команды:

  1. Определить версию X
  2. См. Различия между B и X
  3. Объединить B с X
  4. Обновление с этой новой объединенной версии до HEAD

Есть ли другой подход, который люди используют в этих ситуациях?

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

Ответы [ 2 ]

2 голосов
/ 10 января 2012

Создание новой ветви "X" из точки, где B и master расходятся, а затем слияние B с X не поможет вам. Это было бы просто ускоренным слиянием; буквально не будет изменений в конфликтах, вызванных слиянием B с мастером. Ваша единственная возможность - выполнить слияние B с мастером и устранить конфликты. Конфликты - это то, чем они являются, и нет никакого способа «обойти» их.

1 голос
/ 10 января 2012

Если это достаточно плохо, вы можете просто переписать патч вручную под HEAD или хотя бы более свежую версию.Это не только поможет справиться с конфликтами и оставит вам историю, которая вам, вероятно, понравится больше, но и поможет избежать ошибок, которые не являются частью конфликтов слияния.Потенциал для проблем достаточно велик из-за изменения кода под изменениями, и не все из них фактически представляют как конфликт слияния.

Тем не менее, если вы хотите попытаться сделать это исключительно слиянием-вы, вам придется иметь дело с этими конфликтами так или иначе. возможно , что вы можете избавить себя от некоторой боли, делая это постепенно, шагая вперед во времени с меньшими приращениями.Я мог бы сделать это, постепенно перебрасывая ветвь вперед:

git rebase version-2 old-branch
# deal with conflicts if they happen
git rebase version-3 old-branch
# and so on...
# until old-branch is based on a recent version
git checkout master
git merge old-branch

Это эффективно позволит вам справляться с небольшими изменениями на каждом шаге, а не со всеми сразу.

...