我可以使用旧版本进行修改并推送(使用Mercurial)吗?

时间:2011-03-22 01:40:04

标签: version-control mercurial dvcs backout

说我是否有一个好的修改:3200。然后我想测试一些东西,因为它有10行更改,我需要删除几行,即使我仍在测试我先提交,然后一些更改,再次提交,让我们说,我做了6次提交。

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

$ hg up -r 3200

这是我想要的良好,稳定的版本,现在我可以提交并推送作为提示吗? (如果可能的话,我想避免退出hg backout,因为它看起来很糟糕,而且我不想回滚,因为回滚有副作用“如果有人在这段时间内从我身边撤离,变更可以以某种方式取回在回购“)

3 个答案:

答案 0 :(得分: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。在另一个存储库中,提示可以是其他内容,具体取决于从您那里提取的内容以及在提取时。

如果您经常需要hg push -r .,那么我建议您为其创建一个alias。这样的别名是a gentler push and could therefore be called "nudge"

[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将不会更新为封闭的头部,因此您可以避免此问题。

您可以通过简单地根据它提交子提交来重新打开一个封闭的头。这意味着您可以临时关闭一行开发而不会产生任何不良影响,除了图表中的一个注释表示分支在某个时刻关闭。

答案 1 :(得分:0)

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

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

但据我所知,没有任何方法可以将3200标记为小费。一旦你提交了基于3200的东西,那个新的变更集将是小费,所以你可以做出一些良性的改变并提交它来创建新的小费,但那是一种kludgy。另一个选择是,如果你担心其他合作者不会知道使用3200作为他们工作的基础,因为mercurial不会将其标记为提示,那就是给它一个标签并告诉团队成员确保并更新他们的工作副本在开始工作之前到那个标签。

答案 2 :(得分:0)

krupans answer当然是正确的,他已经提到了现在有两个头的问题。但我想强调的是,你将会有同一个分支的两个负责人,而其他人可能很难理解正在发生的事情以及使用哪个部门。

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

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

在你的回购克隆上试试这个!

只有在尚未将这些更改推送到其他地方时才应该这样做。