[牛角尖]用hg-rebase仅挪动一个branch的最旧一部分

本文已有追加内容:[牛角尖]用hg-rebase仅挪动一个branch的最旧一部分 – 改

最近刚刚开始学习git和hg,对于git的历史修订功能爱不释手,但是在hg下想要如此偷天换日就没那么方便了。幸好现在有了诸如rebase、mq等扩展,事情变得容易了许多。

事实上国内的hg学习资料很少,本人英文水平很残,今天想实现一个功能,Google半天却无解,只好自己想了个歪门邪道的办法绕路实现,总觉得hg应该有内置什么方法可以直接实现,苦于不认识任何VCS的达人,无处求教啊。

实际情况是这样的,因为我依旧喜爱使用branch而不是bookmark或者mq来实现本地的开发分支,然后当把dev分支rebase到主分支时,我希望分段逐步rebase,而不是一股脑全rebase过去(为了整理注释),于是就出现问题了,不知道如何实现……举个实例如下:

thg-glog01

现在想要将dev分支的最旧节点2给挪到主分支上去,保留3、4不动,因为2是一个有意义的、完整的提交,而之后的3、4则是未完成的、无意义的提交,需要以后用rebase –collapse来合并,也就是想要如下效果:

thg-glog04

找现成命令,失败……于是改为研究绕路走,最后用如下方法折腾出了结果:

1、首先第一次rebase把整个dev分支挪到default的头上去,加了–keep参数来保留dev分支本身不在rebase后被删除(也就是说本质上是把dev分支复制了一份到default上):

hg rebase -s 2 -d default --keep

thg-glog02

2、第二次rebase,把要保留的版本3-4“复制”到版本5上(版本5对应的是版本2),这次加了–keepbranch让新复制出来的版本也属于dev分支(不加的话就是default了,如上一条),加上–detach来把版本3-4从版本2上剥离下来,避免带过来不想要的merge信息:

hg rebase -s 3:4 -d 5 --keepbranch --detach

thg-glog03

3、到此为止,我想要看到的那条历史树已经有了,只不过它还藏在一堆其他的垃圾版本中,是时候砍掉他们了,使用杀手锏strip干掉多余的版本2、4、5:

这里注意如果先strip掉了2,那么4、5就会自动递减为3、4,随后需要strip的就是3、4而不是4、5了。如果先strip掉了4、5,那接下去还是strip 2 不受影响。

thg-glog04

这样的做法其实真的是非常麻烦的,如果那位高人知道什么捷径,烦请指点一下啊。

另,rebase、strip之类一般只能用来清理自己的垃圾数据,可千万别对着战友们的劳动成果手起刀落啊……