10

说如果我有一个好的修订版:3200。然后我想测试一些东西,因为它有 10 行更改,我需要删除几行,即使我仍在测试我先提交,并且经过一些更改,再次提交,假设我做了 6 次提交。

现在我想暂停它,但我不想丢失所有编写的测试和代码,所以我想

$ hg up -r 3200

哪个是我想要的好的、稳定的版本,现在我可以提交并推送作为提示吗?(如果可能的话,我想避免退出,hg backout因为它看起来有些糟糕,而且我不想回滚,因为回滚有“如果在此期间有人从我这里拉出,更改可以以某种方式回到回购中”的副作用)

4

3 回答 3

12

在 Mercurial 中,可以通过多种方式暂停事情。最简单的方法是根本不把它推到任何地方。在你回到历史之后

$ hg update 3200

您可以使用

$ hg push -r .

只推送到修订版 3200。这.很重要 - 这意味着工作副本父修订版,在本例中为 3200。修订版 3200 不会在您的本地存储库中“提示”,因为您仍然有修订版 3201-3206,并且最高编号修订始终是我们所说的“提示”。换句话说,历史是这样的:

[3199] -- [3200] -- [3201] ... [3205] -- [3206]
             ^                              ^
            "."                           "tip"

我在其中标记了当前工作副本父修订和提示修订。

当您开始基于修订版 3200 工作时,图表将变为

[3199] -- [3200] -- [3201] ... [3205] -- [3206]
                \
                 \-------------------------------- [3207]
                                                      ^
                                                  ".", "tip"

请尽量不要过分强调“小费”。它一直在变化,通常不是很有趣。如果您跳回 3206 并进行提交,则 tip 将表示您的存储库中新创建的修订版 3208。在另一个存储库中,tip 可以是其他东西,具体取决于从您那里提取的内容以及提取的时间

如果你经常需要做hg push -r .,那么我建议你为它创建一个别名。这样的别名将是一个更温和的推动,因此可以称为“轻推”

[alias]
nudge = push -r .

有了它在你的工具箱中,你总是可以做到

$ hg nudge

将您刚刚创建的变更集发送到服务器,而不必担心发送您可能搁置的任何其他分支。

最后,记住你可以使用

$ hg update 3206
$ hg commit --close-branch -m "Abandoning this line of development"

将 3206 变更集标记为“已关闭”。这意味着它不会出现,hg heads并且在您运行时不会考虑合并hg merge。如果您将它推送到服务器,您需要使用hg push --force它,但是没关系,因为您没有创建多个开放头,您只需添加另一个封闭头。

多个开放头的问题实际上是其中一个hg clone可能会更新一个新的,这会令人困惑——人们不知道从哪里开始工作。使用最新版本的 Mercurial,hg clone不会更新到封闭的头部,因此您可以避免这个问题。

您可以通过简单地基于它进行子提交来重新打开封闭的头部。这意味着您可以暂时关闭一条开发线而不会产生不良影响,除了图表中的一条注释说明该分支在某个时间点关闭。

于 2011-12-21T23:58:30.157 回答
0

从问题和随附的评论中,听起来您希望所有新更改都基于 3200,而将基于 3200 的先前工作作为单独的分支。这很容易做到:

hg up 3200
# work work
hg ci -m "new work based on 3200"

但据我所知,没有任何方法可以将 3200 标记为小费。一旦您基于 3200 提交某些内容,该新变更集将成为小费,因此您可以进行一些良性更改并提交以创建新小费,但这有点笨拙。如果您担心其他合作者不知道使用 3200 作为他们工作的基础,因为 mercurial 不会将其标记为小费,另一个选择是给它一个标签并告诉团队成员确保并更新他们的工作副本在开始他们的工作之前到那个标签。

于 2011-04-02T14:24:15.453 回答
0

krupans的回答当然是正确的,他已经提到了现在有两个头的问题。但我想强调的是,您将拥有同一个分支的两个头,其他人可能很难理解发生了什么以及使用哪个头。

出于这个原因,将您的测试代码放到一个新的分支中可能是有益的,为此您必须重写历史记录。您可以使用 MQ 扩展来执行此操作(假设 3201 是 rev 3200 的子版本,而 3206 是您的最后一个测试提交:

hg qimport -r 3201:3206
hg qpop -a
hg branch branchname
hg qpush -a
hg qfinish -r 3201:3206

在你的 repo 的克隆上试试这个!

仅当您尚未将这些更改推送到其他地方时才应该这样做。

于 2011-12-20T08:54:49.087 回答