Перебазировать коммит слияния - PullRequest
12 голосов
/ 26 января 2012

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

... ─ Foo

... ─ Bar

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

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

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

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

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

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

Ответы [ 3 ]

12 голосов
/ 21 февраля 2014

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

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

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

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

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

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

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

0 голосов
/ 24 августа 2012

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

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

...