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 - Fatal编程技术网

Mercurial 命名的以前未命名的分支

Mercurial 命名的以前未命名的分支,mercurial,Mercurial,给以前未命名的分支命名似乎不太合适。这造成了一个令人讨厌的多头问题,我找不到解决办法 这是工作流程 UserA开始使用他们期望的小功能,所以他们只是开始工作(离开default分支)。这项变更原来是一个大型项目,需要多个贡献者。所以UserA问题hg分支“Feature1”并继续工作,提交所需的文件 然后,UserA从中央回购中提取变更,以便他可以推动 此时,为什么hg heads返回3heads?它为默认值显示2,为功能1显示1。default的第一个头是分支上另一个用户的最新更改(不相关)。

给以前未命名的分支命名似乎不太合适。这造成了一个令人讨厌的多头问题,我找不到解决办法

这是工作流程

UserA开始使用他们期望的小功能,所以他们只是开始工作(离开
default
分支)。这项变更原来是一个大型项目,需要多个贡献者。所以UserA问题
hg分支“Feature1”
并继续工作,提交所需的文件

然后,UserA从中央回购中提取变更,以便他可以推动

此时,为什么
hg heads
返回3heads?它为
默认值显示2,为
功能1显示1。
default
的第一个头是分支上另一个用户的最新更改(不相关)。第二个
default
头是
hg分支“Feature1”
commit之前的commit

中央存储库已强制执行规则,因此每个分支只允许1个头,因此强制推送不是一个选项。回购协议不希望在
默认分支上有多个头

UserA应该能够推动这些更改,以便其他用户可以查看
功能1
分支并提供帮助。我似乎找不到“纠正”这一点的方法。我认为我无法在该特性成为命名分支之前,重新编写其初始提交的分支


我知道命名分支之前的初始更改在技术上是默认分支上的,但这是否意味着在合并
功能1
分支之前,它们将是头?

您在本地回购中看到
默认
分支上的两个头的原因是,在最新的共同祖先之后,中央回购中的变更集与本地回购中的变更集没有任何共同之处

要解决您的问题:

  • 创建一个新的中央repo本地克隆(如果使用最新的公共祖先,可能会更容易)

  • 从第一个本地回购导出更改。注意
    第一次本地更改后的冒号
    ,以获取该回购中的所有更改

    cd local1
    hg export -r first_local_change: > ../local1.patch
    
  • 转到新的本地存储库,创建
    功能
    分支以将更改导入,然后导入它们:

    cd ../local2
    hg branch feature
    hg import ../local1.patch
    
    hg import
    有一个选项可以使用补丁文件中的分支信息,但默认情况下是禁用的


  • 在这一点上,你可以继续使用新的本地回购在原来的地方。此外,我会再次检查,确保所有内容都与新回购协议中的内容一致。

    我找到了一个解决方案,无需重新克隆和合并中的更改。我更喜欢这种方法,主要是出于历史目的,因为我认为它是关于功能发生了什么的有价值的信息(也就是说,它开始很小,然后又被重新认为更大等等)

    在我的示例中,UserA应该更新到
    default
    上不需要的head,并关闭default的分支,因为它是不需要的。这将留下两个标题,一个用于
    default
    ,另一个用于
    Feature1

    hg update -r X // X is the rev of the unwanted head.
    hg commit --close-branch -m "Moved to Named Branch Feature1, cleaning up initial work"
    
    然后更新到
    功能1
    分支,按下并继续工作

    另一个工作流几乎是相同的,除了用户A决定推送
    Feature1
    给其他人帮助,并且
    default
    没有被其他人向前移动。本地回购只有2个头,用户可以推,但是用户A不想仅仅按
    default
    的提示,现在它将是真正“属于”到
    Feature1
    的变更集

    UserA应该更新到最新的、不需要的变更集
    defaul
    t。然后将
    默认值
    恢复到用户开始工作前的版本

    hg update default
    hg revert -r Y // Y is the changeset before UserA started working on the feature
    hg commit -m "Reverting changes that now exist in Feature1 branch"
    

    然后更新到
    Feature1
    分支,按下并继续工作。

    来自
    hg-help-heads
    hg-heads
    不带参数将显示分支头,根据定义,分支头是在同一分支上没有子级的变更集
    hg heads——在这种情况下,topo
    应该提供您需要的结果。

    不要通过中央存储库。让您的开发人员互相取长补短。

    我们发现这是我们团队的一个非常大的问题(针对每个功能进行分支),并最终停止了hgweb.cgi脚本的工作(HTTP 414请求太长)。

    当我写下答案时,我从您的问题中了解到,您主要关心的是将
    default
    分支上的本地存储库中的更改“移动”到
    功能
    分支上。由于情况并非如此,因此合并两个
    default
    头肯定是一个好办法。
    hg update default
    hg revert -r Y // Y is the changeset before UserA started working on the feature
    hg commit -m "Reverting changes that now exist in Feature1 branch"