Подтвердить что ты не робот

Восстановить слияние

Предположим, что мой репозиторий Git изначально имеет две ветки: Foo и Bar.

... ─ Foo

... ─ Bar

Я создаю третью ветвь FooBar, в которой я фиксирую слияние двух других ветвей.

... ─ Foo ──┐
            FooBar
... ─ Bar ──┘

FooBar теперь является одним фиксатором перед Foo и Bar. Затем я делаю еще несколько работ, совершая несколько раз только на Foo.

... ── A ───┬── B ── C ── D ── Foo
            FooBar
... ─ Bar ──┘

Вопрос в том, что, поскольку первый родительский филиал FooBar больше не является Foo, могу ли я перегрузить фиксацию слияния в ветке FooBar, чтобы снова иметь Foo и Bar в качестве двух его родителей? Другими словами, могу ли я включить разработку в Foo в ранее объединенный FooBar вместе с неизменным баром?

... ── A ── B ── C ── D ── Foo ──┐
                                 FooBar
... ─ Bar ───────────────────────┘
4b9b3361

Ответ 1

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

git checkout FooBar
git rebase -p --onto Foo A

Я попытался использовать имена из исходного вопроса. Обратите внимание, что A означает фиксацию, отмеченную как A в искусстве ascii. Вероятно, вы использовали бы хэш коммита или любой другой способ указать на фиксацию, где ветки Foo и FooBar изначально будут разделены.

Флаг -p также известен как --preserve-merges, и он делает в значительной степени то, что он говорит.

Обратите внимание, что ветвь Bar здесь не играет роли, так что строка коммитов может быть именованной веткой, а затем - не имеет значения.

Ответ 2

Вы не можете переустанавливать под веткой FooBar без изменения того, что определяет FooBar. Что вы можете сделать, это объединить FooBar и Foo. Это будет иметь то же самое содержимое, которое вы желаете.

Ответ 3

В основном вы пытаетесь стереть все следы ранее сделанного слияния.

Если вы действительно хотите выбросить все коммиты, которые существуют только в FooBar (и в рабочем каталоге), выполните следующие действия: сначала сделайте git checkout FooBar, затем запустите git забудьте об истории и сделайте git reset --hard Foo (если вы намерены объединить Bar в Foo). Затем вы создадите слияние с помощью git merge Bar.