如何更改Git中的分支点?

How to change the branching point in Git?

假设我的 git 存储库中有以下结构:

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

我想把C'拉到master分支,把分支点改成C',也就是把上面变成

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

我认为我应该结合使用 cherry-picking 和 rebase,但我对具体如何操作感到困惑。我应该执行哪个操作顺序?


建议 评论后更清晰的模式(因为原来的同字母提交实际上是不必要的)

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

与相关的预期结果:

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

您需要执行以下操作:

不要考虑这些提交的哈希引用:CC'DEF。那么:

  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

--force 推送两个分支以完成。

如果您对 git 不满意,我不推荐这样做,但如果绝对需要这样做,我会这样做。

你总是可以走这条路

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

然后 cherry-pick C' 然后根据 master 重新设置 dev 分支的基址。那将是最简单的解决方案。

您只需要将 master 变基到 G:

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

这将重写在 master 中找到的所有提交,这些提交在 G 中找不到 G 之上。没有必要挑樱桃。您的 dev 分支将保持不变。

对于您的新图表,简短的回答是您将 G 变基为:

git checkout master
git rebase <commit_id_G>

较长的答案是您很难看到这一点,因为您将 master 视为 "main" 分支,并将 dev 视为 "offshoot".但是,当然,这些分支名称只是标签,您可以将它们中的任何一个视为 "main" 分支。

而且,由于 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.