我想要重基到一个特定的提交,而不是另一个分支的HEAD:
A --- B --- C master
\
\-- D topic
to
A --- B --- C master
\
\-- D topic
而不是
A --- B --- C master
\
\-- D topic
我怎样才能做到呢?
添加到答案中使用——onto:
我从来没有把它背下来,所以我写了这个小助手脚本:
Git:将一个分支(子)从一个基基重设为另一个基基,留下另一个基基的提交。
用法:
moveBranch <branch> from <previous-base> to <new-base>
简而言之:
git rebase --onto "$3" "$2" "$1"
除此之外,还有一个类似的解决方案,那就是选择一系列的提交:
git co <new-base>
git cherry-pick <previous-base>..<branch>
git branch -f branch
两者的效果差不多。请注意,此语法跳过<previous-branch>本身的提交,因此它会优选下一个和后续的提交,包括<branch>的提交。
既然调整基地是如此重要,下面是内斯特·米利耶夫(Nestor Milyaev)答案的扩展。结合jsz和Adam Dymitruk回答中的Simon South的评论,得到了这个命令,无论它是从主分支的提交A还是C中分支,它都可以在topic分支上工作:
git checkout topic
git rebase --onto <commit-B> <pre-rebase-A-or-post-rebase-C-or-base-branch-name>
注意,最后一个参数是必需的(否则它会倒带分支以提交B)。
例子:
# if topic branches from master commit A:
git checkout topic
git rebase --onto <commit-B> <commit-A>
# if topic branches from master commit C:
git checkout topic
git rebase --onto <commit-B> <commit-C>
# regardless of whether topic branches from master commit A or C:
git checkout topic
git rebase --onto <commit-B> master
最后一个命令是我通常使用的命令。