Rebase a feature branch onto a specific commit of another branch

Refresh

December 2018

Views

744 time

3

I am trying to rebase a feature branch (branched off of master) onto a specific commit of another branch. My initial status was the following

       C -- D            branch1
      /     
A -- B -- E -- F         master
                \
                         branch2 (zero commits after creating the branch)

I first rebased branch2 onto A in master which worked fine. My current status should (according to my understanding) be the following

       C -- D             branch1
      /
A -- B -- E -- F          master
 \
  B -- E -- F             branch2

I verified that branch2 branches off of master at commit A and is even with the master branch. What I now want to get is this

A -- B -- E -- F          master
 \
  B -- E -- F             branch2
   \
    C -- D                branch1

I tried

git checkout branch1
git rebase --onto B branch2

But this resulted in a whole bunch of conflicts and I don't understand at all how these arise. Maybe I am misunderstanding entirely what rebase does?

Note: After successfully rebasing branch1 onto B of branch2, I intend to reset master to A, so the final version is supposed to look the following way.

A                  master
 \
  B -- E -- F      branch2
   \
    C -- D         branch1

1 answers

3

Там некоторые проблемы с вашими предположениями. Во- первых, ветви просто указатели совершает. Вы начинаете с этим, и masterизвлечено.

       C -- D      branch1
      /     
A -- B -- E -- F   master

После того, как у git branch branch2вас есть это.

       C -- D      branch1
      /     
A -- B -- E -- F   master & branch2

Обратите внимание , что нет заглушки ветви, masterи branch2как точка F. Помимо их имена, они неразличимы.

После того, как вы извлекаете branch2и git rebase Aничего не меняется. branch2уже имеет Aв своем происхождении, он по- прежнему указывает на F. Вы должны были получить сообщение типа Current branch branch2 is up to date.

Когда вы сделали , git checkout branch1и git rebase --onto B branch2это смущало вещь. Там же предполагаемый третий аргумент, в настоящее время проверили филиал. То , что вы на самом деле Ран git rebase --onto B branch2 branch1. Это говорит : «взять совершающее достижимые на branch1 , но не от ветви 2 (так же , как git log branch2..branch1и С и D) и поместить их на B». Это должно быть не оп, но если branch1 и branch2 есть какие - либо изменения в роднит перебазироваться выбросит их.

Если С и Е, одни и те же изменения, которые вы бы ветер с этим, и, возможно, конфликт.

       C -- D      original branch1
      /     
A -- B -- E -- F   master & branch2
      \
       D1 branch1

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

Также отметим , что нормированный ветвь имеет Ид D1, а не D. Commit идентификаторы включают идентификатор своих родителей, так что идентификатор должен измениться. rebaseне переписывать историю, он создает новую историю и говорит о том , что, как это было всегда. Тонкое , но важное различие. Ваш оригинальный совершить еще там ... на некоторое время.


Если вы хотите, чтобы перейти от этого:

       C -- D      branch1
      /     
A -- B -- E -- F   master & branch2

К этому.

A                  master
 \
  B -- E -- F      branch2
   \
    C -- D         branch1

Это можно перевернуть так, что совпадет с тем, что у вас есть лучше.

       C -- D      branch1
      /     
     B -- E -- F   branch2
    /
   A               master

Все , что вам нужно сделать , это движение masterв А. Там в несколько способов сделать это, один git branch -f master A. Это заставляет masterперейти к A.