Git master ребаз мастер с ветками - PullRequest
0 голосов
/ 13 декабря 2018

У меня следующая структура git.

            G - H - I <-feature-branch 1
          /
- A - B - C <-master
           \       
             X - Y <-feature-branch 2

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

    G - H - I <-feature-branch 1
   /
- A <-master
   \       
    B - C - X - Y <-feature-branch 2

Спасибо!

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Поскольку ваши ветви элементов имеют одну и ту же отправную точку, и «одна из функций должна быть объединена, чтобы легко объединить другую», т. Е. Обе имеют вещи, необходимые друг от друга, почему бы и нет:

  1. объединить ветвь объектов 1 с 2 (X для справки)
  2. перебазировать X на мастер
  3. объединить X с мастером

и иметь после 2.

- A - B - C <-master
           \       
             G - H - X - I - Y - I <-feature-branch X

и после 3.

- A - B - C - G - H - X - I - Y - I <-master
0 голосов
/ 13 декабря 2018

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

Вы говорите, что в вашем текущем состоянии объединить обе ветви сложно, но на самом деле этоне.Начиная с

            G - H - I <-feature-branch 1
          /
- A - B - C <-master
           \       
             X - Y <-feature-branch 2

, объединить функции в мастер легко.Первое слияние может (и по умолчанию будет выполнено) как быстрая перемотка вперед;даже если вы заставите это быть настоящим слиянием вместо ускоренной перемотки вперед, это все равно будет тривиальным;и затем (в любом случае) второе слияние является простым.(Единственное возможное осложнение состоит в том, что ветви находятся в значительном конфликте, и в этом случае этот подход все еще позволяет приложить минимум усилий для разрешения такого конфликта.)

Это может или не можетпривести к желаемой топологии фиксации;но вы действительно не объяснили, как вы хотите, чтобы это выглядело после слияния (или почему);вы описали только промежуточное состояние, которое, по вашему мнению, вам нужно сначала получить.

мой мастер не отслеживает восходящий поток

Непонятно, что вы подразумеваете подэтот.Вы просто имеете в виду, что местный master опережает по течению?Поскольку в конечном итоге вы будете перемещать как локальную, так и удаленную ветви master вперед к объединениям, которые вы создаете, это в принципе не имеет значения.

любая из функций должна быть объединена, чтобы легко объединитьдругой

Что заставляет вас так думать?Первое слияние любого из master из состояния, которое вы описываете, будет очень легким.

Вы говорите, что хотите перейти в состояние, подобное

        G - H - I <-feature-branch 1
       /
... - A <-master
       \       
        B - C - X - Y <-feature-branch 2

Это на самом деленевозможно;Родитель G является C, и вы не можете «изменить» его, чтобы сделать его родителем A.Вместо этого вы должны заменить его (и полученные из него коммиты), чтобы получить

        G' - H' - I' <-feature-branch 1
       /
... - A <-master
       \       
        B - C - X - Y <-feature-branch 2

Это может быть важно, потому что это означает, что вы будете редактировать историю feature-branch-1.(Редактирование истории - очень полезный инструмент в git, но оно требует затрат, которые вам необходимо понять, если вы собираетесь его использовать, особенно если другие делятся с вами репозиторием в восходящем потоке.)

НоНа самом деле вопрос в том, что действительно удаляет удаление B и C из истории feature-branch-1?Если изменения с G, H или I пересекаются с изменениями с B или C, вы получите конфликты при попытке сделать это;и чтобы разрешить эти конфликты, вы внесете новые изменения, которые создадут дополнительные конфликты, когда вы объедините все вместе в конце.Даже если эти изменения не перекрываются / конфликтуют, если что-либо в feature-branch-1 зависит (преднамеренно или иным образом) от чего-либо в A или B, тогда ваша ветвь будет состоять из нарушенных коммитов, что может затруднить поиск ошибокв будущем.

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

git checkout master
git merge feature-branch-1

который будет работать автоматически и приведет к

... - A - B - C - G - H - I <-(feature-branch 1)(master)
               \       
                 X - Y <-feature-branch 2

, а затем

git merge feature-branch-2

, что даст вам

... - A - B - C - G - H - I - M <-(feature-branch 1)(master)
               \             /
                 X -------- Y <-feature-branch 2

Поскольку все операции приводили только к переходам вперед,нажатие затем обновит пульт полностью.

0 голосов
/ 13 декабря 2018

Итак, сначала вы должны сбросить свой мастер на A:

git checkout master
git reset A --hard

, где, очевидно, A - это хеш коммита, в который вы хотите сбросить.

На этом этапе branch-2 находится в том состоянии, которое вы хотите.История branch-1 по-прежнему содержит коммиты B и C.

Чтобы переписать историю, вам необходимо интерактивно перебазировать поверх мастера:

git checkout branch-1
git rebase -i master

ВыВам будет предложен список коммитов между вашей веткой и мастером с вашим редактором git по умолчанию (обычно vim или nano).

Просто удалите строки B и C, сохраните и выйдите.

Теперь у вас будет результат, который вы разработали.

Надеюсь, это поможет.

...