Git 中是否有某种反向选择?

Is there sort of a reverse cherry-pick in Git?

tl;dr: 如何将当前最后几次提交保留在一个分支上,并用另一个分支的历史替换之前的历史?


我有一个分支,我想保留现有的最后 3 次提交,但用另一个分支的历史替换历史。

所以我有:

        E-F-G   :: my-branch
       /
A-B-C-D   :: main
  \
   B'-C'-D'     :: new-past

我想要

A-B-C-D         :: main
 \
  B'-C'-D'      :: new-past
         \
          E-F-G :: my-branch

目前我正在手动执行此操作

git checkout new-past
git pull
git checkout -b my-branch-temp
git checkout cherry-pick E
git checkout cherry-pick F
git checkout cherry-pick G
git branch -D my-branch
git branch -m my-branch

所以有一些与 cherry-pick 相反的地方,你可以在 mergerebase 上插入过去的提交或其他东西或一些标志,这会让这更优雅吗?


PS-这里的情况是我在另一个分支的子分支上,该分支定期重新设置基址,我试图避免合并提交。

PPS- 如果没有需要解决的频繁冲突,我会尽快编写现有流程的脚本

So is there some opposite of cherry-pick where you can insert the past commit

你的想法是对的,但是你想多了。您可以创建一个新分支和 cherry-pick 您想要的提交,而不是插入过去的提交:

git checkout -b new-past new-branch
git cherry-pick E
git cherry-pick F
git cherry-pick G

在这里,您可以删除旧分支并重命名新分支:

git branch -d my-branch
git branch -m new-branch my-branch

对于大量提交,这既麻烦又耗时 幸运的是,git 提供了一个名为 rebase 的命令来执行批量 cherry picks。它看起来像这样:

git checkout my-branch
git rebase --onto new-past my-branch~3

您可以使用任何 commit-ish 而不是 my-branch-3,例如另一个分支、标记或提交哈希。

感谢@Hasturkun 将我引向 rebase --onto,这让我走向了 Git rebase --onto an overview & How change parent branch in git?

因此对于问题中的示例,答案是:

git rebase --onto D' D my-branch