Git: 如何变基到过去的特定提交?

Git: How to rebase to a specific commit in past?

我想变基到一个特定的提交,它不是另一个分支的 HEAD,而是向后:

A --- B --- C          master
            \
             \-- D --- E   topic

A --- B --- C          master
      \
       \-- D --- E   topic

如何以优雅和通用的方式实现这一点?

总的来说,我的意思是目标提交 (B) 不一定是 HEAD 的直接祖先(我不妨变基到 A 或以前的提交)并且可能不止两个提交主题分支。我可能还想从 B 变基到 A。

使用 git cherry-pick

git rebase 是一种 git cherry-pick 类固醇。

如果您只有几个提交要移动:您可以使用 git cherry-pick 一个一个地挑选它们

# move back to B
git checkout B

# start a branch here, and use it as the active branch
git checkout -b wip

# cherry-pick the commits you want to have
git cherry-pick D
git cherry-pick E

# if all went well : move the 'topic' branch to the current branch :
git checkout topic
git reset --hard wip

# delete the temporary 'wip' branch
git branch -d wip

使用 git 变基

如评论中所述:git rebase 可以采用额外的选项来仅移动一定范围的提交。

您可以使用 :

执行与上述 cherry-pick 序列相同的操作
git rebase --onto B master topic

额外说明:git rebase -i

git rebase 也有一个 --interactive|-i 标志:

git rebase -i --onto B master topic

使用 -i 标志:在执行任何操作之前,git 将为您打开一个文本编辑器,其中将列出所有重新设置基数的提交。

此步骤的明显好处是可以向您展示将应用的内容(在实际应用之前),并且还可以描述比 "picking that commit" 更多的操作。

您可以在网上搜索 git rebase -i 上更完整的教程,这里是一个:
Git Interactive Rebase, Squash, Amend and Other Ways of Rewriting History (thoughtbot.com)