Git:如何将分支rebase到过去的特定提交?

5
我想要将代码库从当前分支回退到另一个分支的某个特定提交,而不是HEAD。
A --- B --- C          master
            \
             \-- D --- E   topic

to

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

如何以优雅且通用的方式实现此目标?

通用的意思是目标提交(B)不一定是HEAD的直接祖先(我可能会变基到A或先前的提交),而主题分支上可能有许多超过两个的提交。 我也可能想要从B变基到A。


我认为 git rebase --onto B --root master 应该是可行的。(当从B变基到A时,只需使用 --onto A --root B)。 - Joachim Sauer
按照@JoachimSauer的建议去做,只要确保你在主题分支上就可以了。 - John Szakmeister
@JohnSzakmeister 或者 git rebase master topic --onto B - alfunx
可能与这个问题有些关联。 - Romain Valeri
@alfunx 那也可以...不过我个人不太喜欢这样--我总觉得参数应该交换--所以我更喜欢另一个版本,因为我总是记不住顺序。 :-) - John Szakmeister
@JohnSzakmeister 我通常会假设我在正确的分支上,然后稍后再添加第二个参数,以防万一我不在。但我同意——这可能会让人感到困惑。 - alfunx
1个回答

7

使用git cherry-pick

git rebasegit 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 rebase

如评论中所述: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会为您打开一个文本编辑器,在那里列出所有经过变基的提交。
这一步骤带来了明显的好处,它可以向您展示将要应用的内容(实际应用之前),并描述比“挑选该提交”更多的操作。
您可以搜索更全面的有关git rebase -i的教程,这是其中之一:
Git交互式变基、Squash、Amend和其他重写历史的方法(thoughtbot.com)

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