在 Git 中,rebase 可以做一些骚操作。这篇就来讲讲 rebase 中的 --onto 选项。
先来看例1:
// 例1A---B---C---D (HEAD, master)\E---F---G
使用 git rebase C F ,会形成下面的提交记录:
A---B---C---D (master)\E'---F' (HEAD)
但,如果是 git rebase --onto C F ,会形成这样的提交记录:
A---B---C---D (master)\G' (HEAD)
可以看到,加上 --onto 之后,与之前的不加的提交记录全变了。我们来看一下 --onto 的选项。
git rebase --onto <newparent> <oldparent> <until>
其中,until 不是必须的选项。
// 例2A---B---C---D (HEAD, master)\E---F---G---H---I
在例2中,使用 git rebase C F H 后的提交记录为:
A---B---C---D (master)\G'---H' (HEAD)
可以看到,他是以 C 结点为根,在 C 之上进行变基,变基的基础是 oldparent 与 until 的共同父节点(不包括父节点)到 until 结点之间的历史。上述就是 F 与 H 的父节点 F 到 H 的历史,也就是 G---H ,变基到 C 上。
如果,对例2使用 git rebase C F 那么提交会变成这样。
A---B---C---D (master)\G'---H'---I' (HEAD)
可以看到,如果没有加 until 他会一直到 oldparent 的结尾。
在例3中,可以让你看出 until 的实用性:
// 例3A---B---C---D (HEAD, master)\E---F---G (server)\H---I (client)
在例3中,使用 git rebase --onto master server client ,就会形成这样的提交:
A---B---C---D (master)---H'---I' (HEAD, client)\E---F---G (server)\H---I
可以看到,它可以截取 server 分支中的 client 分支的提交,变基到 master 分支上。从上面的命令中可看,他是截取 server 和 client 的父节点 E 到 client 结点之间的提交。
