Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mercurial:如何创建计划外的分支_Mercurial_Branch_Commit - Fatal编程技术网

Mercurial:如何创建计划外的分支

Mercurial:如何创建计划外的分支,mercurial,branch,commit,Mercurial,Branch,Commit,我的用例是: 我正在开发一个新功能,我对该功能有几次提交。 因为它是一个次要的特性,我甚至没有考虑在特征分支中做这个特性。 不过。现在我的老板过来告诉我修复我正在处理的同一个分支上的错误(默认) 要解决我想为我的功能创建一个功能分支的问题,请将所有现有(未推送)提交推送到该分支中 因此,我希望在第一次提交之前创建一个分支,然后以某种方式将所有提交移动到该分支 如何执行此操作?对于这种情况,您可以通过(可能需要在您的配置中启用)修复它 在分支上,在要移动的更改集之前更新到修订: hg up -r&

我的用例是:

我正在开发一个新功能,我对该功能有几次提交。 因为它是一个次要的特性,我甚至没有考虑在特征分支中做这个特性。 不过。现在我的老板过来告诉我修复我正在处理的同一个分支上的错误(默认)

要解决我想为我的功能创建一个功能分支的问题,请将所有现有(未推送)提交推送到该分支中

因此,我希望在第一次提交之前创建一个分支,然后以某种方式将所有提交移动到该分支


如何执行此操作?

对于这种情况,您可以通过(可能需要在您的配置中启用)修复它

在分支上,在要移动的更改集之前更新到修订:

hg up -r<revison>
在其上放置一个虚拟提交以获得新修订:

hg commit -m"New Branch"
然后从要移动的第一个更改集执行重基(它会自动移动子体),并将新的分支修订指定为目标:

hg rebase -s<base revision> -d<new branch revision>
hg-rebase-s-d

然后更新回您的主线分支。

根据您的偏好,有两种方法可以实现这一点:

  • 在新的存储库中

    为您的存储库制作一个新的克隆,并在那里进行所需的bug修复。完成后,将其推送到主存储库,然后继续在原始存储库中停止的位置。像往常一样拉并合并以获得新的更改

  • 在现有存储库中

    在本地更改之前更新更改集,然后开始修复并提交更改集。这将创建一个新的匿名分支。完成后,使用
    push-r.
    推送,这将只推送工作副本中包含的更改。在此之后,与原始分支合并(
    hgmerge
    )并继续您离开的地方

    请注意,如果您不愿意将更改保留为未标记状态,可以使用
    hg bookmark
    将功能分支标记为书签。您还可以使用
    hg heads
    轻松找到您留下的任何磁头


  • 就我个人而言,我更喜欢在一个新的干净的克隆中工作,因为您不需要担心分支和在哪里留下未提交的更改。但是,如果您的项目设置很复杂,那么重用现有的repo可能会更方便。

    第四种方法:使用mq修补程序

    • 您必须为repo启用并启动mq扩展
    在hotfix时刻,你

    • 将功能提交转换为一组mq修补程序(
      hg qimport
    • 取消应用集合中的所有修补程序(
      hg qpop-a
    • 代码修补程序,提交
    • 在干净的代码库上完成并测试修补程序
    • 应用集合中的所有修补程序(
      hg qpush-a
      ),修复可能的冲突
    • 将修补程序转换回变更集(
      hg qfinish

    啊,你说得对,我应该读得更清楚一点,他已经提交了。这个答案描述了如何将更改重新定位到新的命名分支上。我认为这是丑陋的;rebase是一个历史修改操作,命名分支通常不用于特殊分支(正是因为它们需要提前设置,并且不能在不修改历史的情况下追溯添加)。使用匿名分支或克隆(可选地与书签结合使用)更好、更简单。@LaurensHolst Rebase是一种常用且公认的机制。如果更改是本地的,它工作得非常好。谢谢你,这看起来是我想要的魔法尘埃。我当时很匆忙,我已经“修复”了我的回退问题,但这太难看了,我破坏了构建:/我下次会尝试这种方法。@LasseL实际上,如果你可以毫无问题地使用匿名分支,你只需
    hg update-r
    到以前的修订版,然后继续编写新的代码“fork”,根据Laurens的建议,+1以前从未使用过
    -r
    ,下次我发现自己处于这种情况时,我会尝试一下。当我与SVN合作时,我为项目的每个分支都有一个eclipse工作区。我想我也可以用mercurial来解决这个问题,也许这是解决这个问题最实用的方法。@LasseL:你可以选择最适合你的方式!:)@LaurensHolst—方法1大错特错:克隆的repo将是源代码的完整镜像,使用主repo返回更改是愚蠢的。方法2:a)
    push-r
    不能有参数“”,只有cset ID 2)N-heads分支只能用-f推送,必须先进行合并push@LazyBadger:“大错特错”,老实说?在做出如此强烈的声明之前,请了解更多信息。首先,我不明白你为什么认为克隆人是个问题?这是一个DVCS,利用它对你有利。它是硬链接的,所以如果您担心磁盘空间消耗,请不要担心。2.
    push-r
    最确定的是可以有一个参数
    。它是当前工作副本的变更集ID的别名。由于您只推送工作副本的标头,因此不推送多个标头,因此不需要合并正在进行的工作功能分支。请注意,MQ相当复杂,实际上不是标准DVCS流的一部分。这是一个建立在DVCS之上的补丁队列系统。我不推荐新手使用它。此外,它也是一个历史修改操作,对于一些同样可以由标准DVCS流处理的操作。
    hg rebase -s<base revision> -d<new branch revision>