将较旧的提交移动到新的独立分支(推送到远程)

Move Older Commits To New Separate Branch (Pushed To Remote)

我是 Git 的新手,需要一些帮助。这个问题类似于 Move the most recent commit(s) to a new branch with Git 但那个问题询问的是最近的提交。这不是我需要的。让我进一步解释...

我有一个分支,我们称它为 Feature1 分支。 Feature1 的父级是主分支,Feature1 有以下提交:

但是,A 和 B 提交并不真正属于那个特定的分支,实际上应该在不同的分支中,该分支是 Feature1 分支的子分支。我们将 A 和 B 所属的这个假定分支称为 Feature2 分支。同样,这个分支必须来自 Feature1 分支,而不是来自 master 分支。

尚未创建此 Feature2 分支。但是,Feature1 的内容已经被推送到远程。我的问题基本上是...如何将 A 和 B 提交移动到名为 Feature2 的新分支?

注意:C、D、E 和 F 不依赖于 A 和 B。A 和 B 更改的文件与分支中的其他提交完全不同。

假设 A 和 B 不是最近的提交,你有:

m--m                   (master)
    \
      a--b--c--d--e--f (feature1)

由于 feature1 已经被推送,重新设置它的基址以重写它的历史是有风险的。

然后您可以 revert a--b 以便 feature1 显示这些更改:

git checkout feature1
git revert a^..b

m--m                      (master)
    \
      a--b--c--d--e--f--g (feature1)

然后你可以从feature1创建一个feature2分支,cherry-pick a--b在上面:

git checkout -b feature2
git cherry-pick a^..b

m--m                      (master)
    \
      a--b--c--d--e--f--g (feature1)
                         \
                          a'--b' (feature2)