Git: лучший способ переместить 3-ю ветку в 1-ю ветку после слияния 2-й ветви - PullRequest
0 голосов
/ 03 марта 2020

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

Через некоторое время я создаю запрос на извлечение в Github, чтобы объединить B с О. Но поскольку я не хочу ждать, я создаю ветку C из B, прежде чем она будет объединена.

[A] a---b---c---c1---c2
            \(A)
[B]           d---e---f
                      \(B)
[C]                     g---h

Я зафиксировал на C, а между тем ветвь B была объединена с A Поэтому я хочу очистить свою работу и обновить локальную букву А, вытянув ее из источника, чтобы у меня была такая ситуация:

[A] a---b---c---c1---c2---d---e---f
                                  \(A)
[C]                                 g---h

Теперь вот моя проблема: я хочу, чтобы C был перебазирован на A, но поскольку B был объединен и удален (даже локально, потому что я вытащил), поэтому, чтобы перебазировать его, я не могу сделать что-то вроде:

git rebase B C --onto A

Но B больше не существует, поэтому, когда я git log, это в основном то, что у меня есть:

[A]a---b---c---c1---c2

[C] d'---e'---f'---g---h


(This is what I have to do in order to rebase)

git rebase f' C --onto A

Это работает, но мне нужно проверить, что га sh последнего коммита из BI можно угадать из C (здесь это f '), и я могу ошибиться здесь (и это выглядит ужасно, как если бы все коммиты из B alw ays были включены).

Есть ли лучший способ перенести C на A после слияния B? Может быть, я должен что-то сделать, прежде чем потянуть A?

Если это не совсем понятно, пожалуйста, дайте мне знать (я не задаю здесь вопросы часто! :))

1 Ответ

1 голос
/ 03 марта 2020

Исходя из точной диаграммы первого ответвления, которую вы дали, вам нужно только перебазировать ветвь C на ветке A:

# from C branch
git rebase A

Это воспроизведет коммиты от d до h поверх новой базы, заканчивающейся коммитом c2, на ветке А. Обратите внимание, что я на самом деле нарисовал бы получившуюся перебазированную ветвь C следующим образом:

C: a -- b -- c -- c1 -- c2 -- d' -- e' -- f' -- g' -- h'

Простые метки (т.е. d' вместо d) указывают, что коммиты d' - h' на самом деле были переписаны . Обратите внимание, что воспроизведение коммитов во время перебазирования означает, что коммиты сделаны снова и фактически являются новыми коммитами.

Что касается того, что происходит, когда вы хотите объединить перебазированный C обратно в A, давайте нарисуем диаграмму таким образом:

A: a -- b -- c -- c1 -- c2
                          \
C:                         d' -- e' -- f' -- g' -- h'

После изменения C на A прежняя ветвь теперь полностью опережает последнюю ветвь A. Это означает, что если вы хотите объединить C обратно в A, вы просто должны иметь возможность fast-forward A ответвления, непосредственно применяя коммиты d' хотя f' сверху A.

...