Как создать ветку, которая объединяет оба изменения в главном и в другой ветке, которая была ответвлена от более старого мастера?

#git #github

#git #github

Вопрос:

Итак, я сделал PR в GitHub, который был объединен с master. Теперь у меня есть другой PR, для объединения которого потребуется некоторое время, и который был отделен от master до того, как был объединен первый PR.

Теперь я хочу поработать над третьим PR, но он должен быть разветвлен на последнем главном, а также включать изменения, которые были сделаны во 2-м PR, о котором я упоминал (для объединения потребуется время).

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

Как мне интегрировать последнюю версию master, а также изменения из несвязанной ветки в новую ветку?

Комментарии:

1. Можете ли вы обновить 2-й PR, чтобы использовать последний мастер?

2. @Schwern Да, я думаю. Как бы я это сделал?

Ответ №1:

Как мне интегрировать последнюю версию master, а также изменения из несвязанной ветки в новую ветку?

Самое простое, что нужно сделать, это создать новое ответвление от главного и объединить во 2-м PR.

 $ git checkout -b 3rdPR master
$ git merge 2ndPR
  

После того, как 2-й PR будет объединен с master, обновите 3-й PR, снова объединив master с 3-м PR.

 $ git checkout 3rdPR
$ git merge master
  

В качестве альтернативы, переустановите 3rdPR поверх master.

 $ git checkout 3rdPR
$ git rebase master
  

Это приведет к более чистой истории без всех промежуточных слияний обновлений.


Более продвинутая вещь, которую нужно сделать, это сначала перебазировать ваш 2-й PR на master. В любом случае, это хорошая идея, это означает, что 2-й PR обновлен во время проверки. Тогда вы можете просто отделить 2-й PR.

У вас есть это.

      G - H [2ndPR]
    /
A - B ----- F [master]
          /
      D - E
  

Затем перебазируйте.

 $ git checkout 2ndPR
$ git rebase master

              G1 - H1 [2ndPR]
             /
A - B ----- F [master]
          /
      D - E
  

(Поскольку вы уже нажали 2ndPR, вам нужно будет принудительно запустить обновление. Не используйте --force , используйте git push --force-with-lease . Объяснение здесь.)

Теперь создайте ответвление от 2ndPR.

 $ git checkout -b 3rdPR 2ndPR

              G1 - H1 [2ndPR][3rdPR]
             /
A - B ----- F [master]
          /
      D - E
  

И некоторая работа над 3rdPR.

                      J - K [3rdPR]
                    /
              G1 - H1 [2ndPR]
             /
A - B ----- F [master]
          /
      D - E
  

Если обновлен 2ndPR…

                      J - K [3rdPR]
                    /
              G1 - H1 - L - M [2ndPR]
             /
A - B ----- F [master]
          /
      D - E
  

…вы можете снова переназначить 3rdPR поверх 2ndPR.

 $ git rebase 2ndPR
                              J1 - K1 [3rdPR]
                             /
              G1 - H1 - L - M [2ndPR]
             /
A - B ----- F [master]
          /
      D - E
  

Когда 2ndPR объединяется…

                               J1 - K1 [3rdPR]
                             /
              G1 - H1 - L - M
             /               
A - B ----- F --------------- N [master]
          /
      D - E
  

…перебазируйте 3rdPR на master.

 $ git rebase master
              G1 - H1 - L - M   J2 - K2 [3rdPR]
             /                /
A - B ----- F --------------- N [master]
          /
      D - E
  

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

Ответ №2:

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

Перебазирование, вероятно, займет столько же времени, сколько и его объединение, и может значительно усложнить задачу, если сделано неправильно. Если сомневаетесь, не перебазируйте, просто объедините. Это легче отменить позже, если что-то пойдет не так.

В принципе, в вашем случае (ИМХО) нужно перейти к ветке PR2 (той, для слияния которой требуется много времени), создать новую ветку под названием PR3 (ту, над которой вы будете работать сейчас), а затем оформить PR3, а затем … объединить мастер в PR3.

Да. Я чувствую вашу боль. Это так же, как объединение PR2 в master. Но в конечном итоге вам придется объединить PR2 с master в какой-то момент. Лучше сейчас, чем позже. В большинстве случаев, чем дольше вы откладываете это, тем хуже становятся конфликты.

Кроме того, вам нужно, чтобы в PR3 были изменения как от PR2, так и от самого последнего главного… затем вам нужно объединить их. master в PR2 / 3, PR2 / 3 в master, это не имеет значения. Даже если вы rebase , это все равно приведет к тем же конфликтам. Это потому, что вам нужен контент из обеих ветвей, и это изменения контента из одной ветви, которые конфликтуют с изменениями контента из другой ветви. Если вы хотите оба набора изменений, вы должны разрешить конфликты..

Единственный способ «уйти» от разрешения конфликтов — это запустить PR3 с самого последнего основного сервера, затем вручную просмотреть все изменения из PR2 и повторно применить их вручную как новые коммиты на PR3 (следовательно, на master, поскольку в этом упражнении мы запускаем PR3 на master). После выполнения этого (имеется в виду: копирование каждого изменения в каждый файл и вставка его в нужное место, фиксация, внесение следующего изменения и т.д. и т.п.) Вы получите PR3, содержащий как самый последний основной файл, так и изменения из PR2…

…но на самом деле, то, что вы сделали, было rebase похоже на что-то, только вручную. И вы вручную разрешили все конфликты на лету. Итак, в итоге вы как бы вручную объединили PR2-> master, назвав его PR3, а затем НЕ сказали git, что вы все это объединили и решили все проблемы.

Итак. Серьезно. Я бы посоветовал:

  • создайте ветку PR3 на PR2
  • оформить заказ PR3
  • объединить мастер в PR3 //A
  • разрешать конфликты //B
  • фиксация //C
  • работа над PR3

и в качестве бонуса, результатом A B C является готовый кандидат на PR под названием «наконец-то объединенный PR2 в master»

(также обратите внимание, что в приведенном выше списке дел нет ни одного обновления для PR2 или master. Они остаются нетронутыми. Если что-то пойдет не так с A / B / C, просто удалите ветку PR3 и начните заново)