使用Mercurial SCM进行分支管理

7

目前我正在学习Ruby on Rails,并通过书籍《Agile Web Development with Rails》进行实践。我还决定尝试使用Mercurial,因为我已经了解了分布式源代码管理系统,并且它似乎是一个理想的选择。然而,为了防止硬盘出现问题,我仍然更喜欢将我的代码远程推送到我的Linux VPS。

所以,我的问题与Mercurial中的分支有关。目前我已经设置了一个远程存储库,可以轻松地通过SSH推送更改(甚至我还设置了一个Nginx FastCGI站点,让我也可以进行推送)。然而,我想做的是在每个章节上创建一个分支,这样我就可以保持对我的进度的有序历史记录。所以这就是我正在做的事情:

$ hg branch chapter-10
(完成第十章内容)
$ hg commit -m "第十章完成"
$ hg update default
$ hg merge chapter-10
$ hg commit -m "将第十章合并到默认分支"
$ hg push

一旦我执行了push语句,Mercurial就会给我返回以下信息:

pushing to ssh://myserver/hg/depot
searching for changes
abort: push creates new remote branch 'chapter-10'!
(did you forget to merge? use push -f to force)

所以此时我尝试再次执行hg merge,它告诉我没有需要合并的内容,这显然是正确的,因为我刚刚已经合并了。当我强制使用-f推送时,一切似乎都很好,甚至Web界面也显示了适当的分支。

总之,我的问题很简单:我是否正在正确地处理这个问题?有没有更适合Mercurial(即“Mercurial方式”)的方法?老实说,我只希望存储库作为备份。我喜欢分布式源代码管理模型,但对我来说,强制推送感觉有点“不干净”。非常感谢您提供任何见解!


你的意图是:a)在你完成每个章节时设立一系列检查点,或者b)同时在不同的分支上打开多个章节进行编辑? - Tarydon
我在这里的意图是选择选项A,但在团队场景中,我也可以看到选项B的价值。 - Scott Arrington
3个回答

6
push -f是您的情况下正确的选项,上个月有讨论在出现“push creates new remote branch”警告时添加该命令:请参见问题1513
然而,本月问题1974提到了一些不良影响(虽然不适用于您的情况)。请查看翻译文章以了解更多有关在远程repo上创建第二个head的信息。
在更一般的情况下,如果您在并行编写章节,并且只想在某个(稳定)时间点合并它们,则可以使用分支。
但是,如果您的写作过程更线性,您可以只使用一个分支,并沿途放置一些标记。但是,如果您回到第10章添加一些行,即使您已经放置了标记11和12,这也会使历史记录更难读取。因此,在这种情况下,分支仍然是一个好主意。

1
谢谢提供的链接。非常有用的信息。看起来我试图使用分支,而标签可能更适合。 - Scott Arrington

4
我不知道你具体的问题,但从你的评论中看来,你可能想使用标签而不是分支。
通常情况下,当多个人合作开展同一个项目时,分支用于创建工作分离,这样一个人可以在稳定的代码片段上工作,而另一个人则可以进行一些实验性的工作,暂时破坏功能。或者,当在主干上开发时,分支用于稳定发布。
标签(或标记)主要用于创建标记,表示代码版本的重要性。例如,如果您想标记第10章的完成,只需使用“chapter-10”标签标记所有当前版本即可。此时无需分支。如果将来有必要,可以从已标记的版本中随时创建分支。

我同意。考虑到您可以随时返回并从任何需要的地方分支,提前创建分支似乎是YAGNI的明显例子。 - Carl Meyer

2

在这种情况下,我认为使用-f进行推送是完全可以的。它只会创建新的分支,而不是head。创建远程heads是另一回事。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接