假设我有没有分支这样的修订历史:分公司,其中包括非连续修订
1
2
3
4
现在,我想在我的存储库中创建一个新的分支版本1
和3
,但不能修改2
或4
。修订版2
/3
中没有冲突的更新。有没有办法做到这一点。我的最终处置库应该有两个分支这样的:
4
3
2 3
|/
|/
1
假设我有没有分支这样的修订历史:分公司,其中包括非连续修订
1
2
3
4
现在,我想在我的存储库中创建一个新的分支版本1
和3
,但不能修改2
或4
。修订版2
/3
中没有冲突的更新。有没有办法做到这一点。我的最终处置库应该有两个分支这样的:
4
3
2 3
|/
|/
1
如果您已经发布此回购的公共场所(或任何开发者已经克隆你的回购),您可以用graft
和backout
组合做到这一点。
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
错误....用于线性单分支历史。退出只是从另一个故事 –
@LazyBadger:我已经更新了我的答案......你能更详细地解释你的反对意见吗?我不明白你的意思是“退出只是来自另一个故事”。 –
我不能在评论中显示'glog',但我测试过 - 你会得到另一棵树,而不是OP请求重写:backout创建额外的提交 –
因为你说过任何关于命名分支,我们与匿名分支
前工作:
>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 BRANCHNAME
和hg ci -m "Creating branch"
,在rebase中使用-d 4而不是0
肯定值得引发警告,如果你已经在某个地方推出了这个回购,那么为了换底就太迟了。 –
@ Ry4an:阶段废弃了这种警告 –
大多数人仍然没有运行阶段构建。我会留下警告。 –
从您的意见,这听起来像你想实现什么是所谓的“采樱桃谬误”:有选择地一些变更复制到另一个分支,没有把他们当作一个合并。如果这是正确的,您可以通过首先在版本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之间的关系。
无法有选择地导入某些更改集并将操作视为合并:合并始终将完整(线性)历史记录统一到合并点。
@Lazy Badger,你为什么从主分支中删除版本3?如果可能,我想在那里。 –
如果我的印象不对 - 我会解决它。主线将1-2-3-4,只有3 ** **复制到新的父母,是吗? –
是的。对不起,如果最初不明确。 –