我们正在实现一个开发流程,其中每个新功能都有自己的分支,在完成后合并到默认分支。问题是新回购中的第一次提交发生在第一个功能分支中。按下时,功能分支将成为默认分支。没有称为“默认”的分支,因为没有与该分支关联的变更集。显然,当将功能分支合并到(不存在的)默认分支时,这是一个问题。
我遇到的唯一解决方案是,每当启动一个新项目时,首次提交默认值作为约定,以便我们有一个名为“default”的分支,它是所有其他分支的父级。是否有更简洁的方法来执行此操作,不需要虚拟提交(例如,“默认情况下提交空变更集”)?
答案 0 :(得分:3)
虽然Mercurial会让你在没有default
分支的情况下工作,但不建议这样做。我们的wiki page说:
不要为主要开发分支使用默认名称以外的名称
Mercurial的主分支称为“默认”,类似于SVN中的“trunk”,CVS中的“HEAD”和Git中的“master”。它是由新克隆检出的分支。如果您尝试为“主”分支使用其他名称,则用户在克隆并在错误的位置提交内容时会获得或多或少的随机分支,这通常是不可取的。
因此,您应该尝试将default
分支作为主要开发分支。
如果您希望“始终”在功能分支中工作,那么我建议您在启动项目时仍然在default
分支上进行几次提交。大多数项目都需要一些常见的设置,所以我认为这不会奇怪或奇怪。
答案 1 :(得分:2)
我可以看到两种可能性(考虑到Martin的答案,建议您将default
作为主要开发分支。)
One Martin已经介绍过,您在新存储库中做的第一件事就是“初始设置”。通常,这可能包括您的标准模板.hgignore
文件。顺便说一句,我发现这是比...更好的选择。
如果您已经提交到另一个已命名的分支,则另一个选项是更新到null
变更集(清空您的工作目录),然后merge
更新到其中。这会创建一个名为“default”的分支。
首先,我们将在开发分支上做一些工作:
C:\tmp\test>hg init .
C:\tmp\test>hg branch devbranch
marked working directory as branch devbranch
C:\tmp\test>echo something > out.txt
C:\tmp\test>hg add .
adding out.txt
C:\tmp\test>hg commit -m "some work"
C:\tmp\test>hg log
changeset: 0:4631a4a10552
branch: devbranch
tag: tip
summary: some work
这里我们在devbranch
分支上有一个提交。当工作完成时(在这种情况下偶然发生),我们希望将工作合并回我们的(不存在的)default
分支。因此,在进行合并之前,我们会更新为null
:
C:\tmp\test>hg update null
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
C:\tmp\test>hg merge devbranch
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
C:\tmp\test>hg commit -m "merged"
C:\tmp\test>hg log
changeset: 1:55e879b67c69
tag: tip
parent: -1:000000000000
parent: 0:4631a4a10552
summary: merged
changeset: 0:4631a4a10552
branch: devbranch
summary: some work
C:\tmp\test>hg branches
default 1:55e879b67c69
devbranch 0:4631a4a10552 (inactive)
如您所见,分支default
是使用该分支上的第一个变更集创建的,其中包含两个父项-1
和0
。在此之后,当您想要合并时,您只需更新到default
分支的提示 - hg update null
只会在第一次完成。