Как изменить точку ветвления в Git? - PullRequest
4 голосов
/ 14 февраля 2020

Предположим, у меня есть следующая структура в моем репо git:

          C'---D'---E'---F'    (dev)
        / 
A---B---C---D---E---F       (master)

Я хотел бы потянуть C' в основную ветвь и изменить точку ветвления на C', т.е. Я хочу превратить все вышеперечисленное в

              D'---E'---F'     (dev)
             / 
A---B---C---C'---D---E---F  (master)

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


Предложение после комментариев для более четкой схемы (поскольку одноименные фиксации в оригинале фактически не нужны)

          G---H---I---J   (dev)
         / 
A---B---C---D---E---F     (master)

со связанным ожидаемым результатом:

              H---I---J    (dev)
             / 
A---B---C---G---D---E---F  (master)

Ответы [ 3 ]

1 голос
/ 14 февраля 2020

Вам просто нужно перебазировать master на G:

git checkout master
git rebase <id-of-G>

Это перезапишет все коммиты, найденные в master, которых нет в G поверх G. Нет необходимости собирать вишню. Ваша ветка dev не изменится.

1 голос
/ 14 февраля 2020

Короткий ответ для вашей новой диаграммы: вы перебазируете G с помощью:

git checkout master
git rebase <commit_id_G>

Более длинный ответ заключается в том, что вам трудно увидеть это, потому что вы думаете о master как "основная" ветвь, и думая о dev как "ответвление". Но, конечно, эти имена ветвей являются просто метками, и вы можете рассматривать любую из них как "основную" ветвь.

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

          H---I---J        (master)
         / 
A---B---C---D---E---F---G  (dev)

со связанным ожидаемым результатом:

              H'--I'--J'    (master)
             / 
A---B---C---D---E---F---G   (dev)

Надеемся, что здесь легче увидеть, что нам просто нужно перебазировать master из этого нового D вместо C.

0 голосов
/ 14 февраля 2020

Вам нужно будет сделать следующее:

Не принимать га sh -рефсы этих коммитов: C, C', D, E, F , Тогда:

  1. git checkout master
  2. git reset --hard C
  3. git cherry-pick C'
  4. git checkout dev
  5. git rebase -i master (интерактивная перебазировка, чтобы избавиться от C ')
  6. git checkout master
  7. git cherry-pick D
  8. git cherry-pick E
  9. git cherry-pick F

Пу sh обе ветви с --force до фини sh.

Я не рекомендую это, если вы не знакомы с git, но я бы так go об этом, если абсолютно необходимо сделать это таким образом.

Вы всегда можете go этот маршрут

                           D'---E'---F'     (dev)
                          / 
A---B---C---D---E---F---C'  (master)

и просто cherry-pick C', затем перебазировать свою ветку dev против master. Это было бы самым простым решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...