2012-11-16 16 views
0

假设我有没有分支这样的修订历史:分公司,其中包括非连续修订

1 
2 
3 
4 

现在,我想在我的存储库中创建一个新的分支版本13,但不能修改24。修订版2/3中没有冲突的更新。有没有办法做到这一点。我的最终处置库应该有两个分支这样的:

4 
3 
2 3 
|/
|/ 
1  
+0

@Lazy Badger,你为什么从主分支中删除版本3?如果可能,我想在那里。 –

+0

如果我的印象不对 - 我会解决它。主线将1-2-3-4,只有3 ** **复制到新的父母,是吗? –

+0

是的。对不起,如果最初不明确。 –

回答

3

如果您已经发布此回购的公共场所(或任何开发者已经克隆你的回购),您可以用graftbackout组合做到这一点。

graft命令会将一个提交从一个分支复制到另一个分支。 backout命令将反转先前提交所做的更改。

下面的例子应该复制您的情况:

hg init test 
echo test>>test\test.txt && hg -R test ci -Am "baseline" 
echo test>>test\test.txt && hg -R test ci -Am "changeset 1" 
echo test>>test\test.txt && hg -R test ci -Am "changeset 2" 
echo new>>test\new.txt && hg -R test ci -Am "changeset 3" 
echo test>>test\test.txt && hg -R test ci -Am "changeset 4" 
hg -R test backout -r 3 
hg -R test ci -m "backed out changeset 3" 
hg -R test update -r 1 
hg -R test graft -r 3 
hg -R test glog --template "{desc}\n" 

这将创建你想改变一个新的匿名分支,同时删除从原来的分支转3的变化,无需修改库的历史。

这导致以下日志:

@ changeset 3 
| 
| o backed out changeset 3 
| | 
| o changeset 4 
| | 
| o changeset 3 
| | 
| o changeset 2 
|/ 
o changeset 1 
| 
o baseline 
+0

错误....用于线性单分支历史。退出只是从另一个故事 –

+0

@LazyBadger:我已经更新了我的答案......你能更详细地解释你的反对意见吗?我不明白你的意思是“退出只是来自另一个故事”。 –

+0

我不能在评论中显示'glog',但我测试过 - 你会得到另一棵树,而不是OP请求重写:backout创建额外的提交 –

2

因为你说过任何关于命名分支,我们与匿名分支

前工作:

>hg glog --template "{rev}:{desc}\n" 
@ 3:Added d.txt 
| 
o 2:Added c.txt 
| 
o 1:Added b.txt 
| 
o 0:Initial commit 

>hg rebase -s 2 -d 0 

>hg glog --template "{rev}:{desc}\n" 

@ 3:Added d.txt 
| 
o 2:Added c.txt 
| 
| o 1:Added b.txt 
|/ 
o 0:Initial commit 

>hg rebase -s 3 -d 1 

>hg glog --template "{rev}:{desc}\n" 
@ 3:Added c.txt 
| 
| o 2:Added d.txt 
| | 
o | 1:Added b.txt 
|/ 
o 0:Initial commit 

在命名分支的情况下,你在第一次rebase之前必须hg branch BRANCHNAMEhg ci -m "Creating branch",在rebase中使用-d 4而不是0

+2

肯定值得引发警告,如果你已经在某个地方推出了这个回购,那么为了换底就太迟了。 –

+0

@ Ry4an:阶段废弃了这种警告 –

+0

大多数人仍然没有运行阶段构建。我会留下警告。 –

0

从您的意见,这听起来像你想实现什么是所谓的“采樱桃谬误”:有选择地一些变更复制到另一个分支,没有把他们当作一个合并。如果这是正确的,您可以通过首先在版本1中创建普通分支,然后将其复制到要复制的变更集上。命令hg graft是专为此目的而设计的。

下面是它如何与一个名为分支,selective工作。如果您想要无名分支,只需省略分支创建。

hg update -r 1 
hg branch selective 
hg graft -r 3 

结果会是这样的(其中,我希望,是你想要的):

4 
| 
3 
| 5 = 3 
2/
|/ 
1 
| 
0 

默认情况下,移植物将复制用户,日期和说明从源头变更(S )。新修订版与修订版3具有相同的效果,但会有新的数字和哈希ID。 Mercurial将不会意识到修订3和5之间的关系。

无法有选择地导入某些更改集并将操作视为合并:合并始终将完整(线性)历史记录统一到合并点。