将一个特性分支在另一个分支的特定提交上进行变基

3

我正在尝试将一个功能分支(从主分支分离)变基到另一个分支的特定提交上。 我的初始状态如下:

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

我首先将branch2重新基于master中的A进行了变基,这个过程很顺利。根据我的理解,我的当前状态应该是以下内容:

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

我确认分支`branch2`从主分支的提交`A`开始分离,并且与主分支保持一致。现在我想要得到的是:
A -- B -- E -- F          master
 \
  B -- E -- F             branch2
   \
    C -- D                branch1

我尝试过

git checkout branch1
git rebase --onto B branch2

但是这导致了许多冲突,我完全不明白这些冲突是如何产生的。也许我完全误解了rebase的作用?

注意:在成功将branch1重新定位到branch2的B之后,我打算将主分支重置为A,因此最终版本应该如下所示。

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

3
为什么不直接将master重置为A?你想要实现什么目的? - user4003407
如果我只重置masterbranch1会发生什么?我正在尝试建立一个带有branch2的暂存/开发分支,并将master重置为当前应该部署的版本。 - denise
1
在Git中,分支只是指向提交的指针。因此,当您移动指针 master 时,指针 branch1 仍将指向与之前相同的提交。 - user4003407
1个回答

4
你的假设存在一些问题。首先,分支只是指向提交的指针。你从这里开始,检出了master分支。
       C -- D      branch1
      /     
A -- B -- E -- F   master

在执行git branch branch2之后,您将得到以下结果。
       C -- D      branch1
      /     
A -- B -- E -- F   master & branch2

请注意,没有存根分支,masterbranch2都指向F。除了它们的名称之外,它们是无法区分的。
一旦你切换到branch2并执行git rebase A,什么也不会发生。 branch2已经在其祖先中具有A,它仍然指向F。您应该收到像“当前分支branch2已经是最新的”这样的消息。
当你运行git checkout branch1git rebase --onto B branch2时,这让事情变得混乱。有一个假设的第三个参数,即当前检出的分支。实际上,您运行的是git rebase --onto B branch2 branch1。这意味着“获取分支1可达但分支2不可达的提交(与git log branch2..branch1或C和D相同)并将它们放在B上”。这应该是一个空操作,但如果分支1和分支2有任何共同的更改,则重新基础将抛弃它们。
如果C和E进行了相同的更改,则可能会出现以下情况以及冲突。
       C -- D      original branch1
      /     
A -- B -- E -- F   master & branch2
      \
       D1 branch1

这段话听起来有些不太合理,但当你试图在两个近亲之间变基时,就会发生这种情况。

此外,请注意,变基后的分支ID为D1,而不是D。提交ID包括其父级的ID,因此ID必须更改。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 移动到 A。有几种方法可以实现这一点,其中之一是 git branch -f master A。这会强制将 master 移动到 A


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接