【问题标题】:Can I make an older revision the tip and push (using Mercurial)?我可以将旧版本作为提示并推送(使用 Mercurial)吗?
【发布时间】:2024-04-17 01:15:01
【问题描述】:

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

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

$ hg up -r 3200

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

【问题讨论】:

  • 是的,当然。你有什么问题?
  • 如果有疑问,或者你只是想干净地分开你的两个“分支”,你也可以保持你现在的中止工作副本,将 repo 克隆到一个新位置,在那里更新到 rev3200并从那里提交/推送。
  • 我想......我不能提交或推送......当我提交时,我认为它说“没有什么可以提交”
  • 我明白了,您想再次将未修改的 r3200 提交为 r3225。不确定这是否可能,也没有太大意义。如果你想对其他人“隐藏”r3201..r3224,你不必推动他们。只需将它们保存在您的本地副本中,然后从 r3200 开始一个新的克隆。 (你已经推他们了,对吧?)
  • 好吧,我不需要将 r3201 隐藏到 3224...但只是它的功能尚未完成或处于实验状态...所以我只希望 r3200 与 3225 相同. 我可以hg push -f(这是“强制”它),但是如果他们在我之前或在我之后推动,或者承诺但没有推动(在我的“强制推动”之前或在我的“强制推动”之后)它会影响其他人") 他们稍后会推送

标签: version-control mercurial dvcs backout


【解决方案1】:

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

$ hg update 3200

你可以使用

$ hg push -r .

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

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

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

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

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

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

如果你经常需要做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 不会更新为封闭头,因此您可以避免这个问题。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 如果你在某处添加一个空间并提交然后推送,它会说有多个头,你需要合并...我尝试与tip合并,它说没有用,我必须与旧版本合并,它又回到了最新版本。所以我不能提交和推送。
    • 如果你知道你想创建一个新的头,你可以做一个hg push --new-branchhg push -f。根据你的描述,你想要一个新的脑袋。
    【解决方案3】:

    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
    

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

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

    【讨论】:

    • 这是不必要的。回到 3200 并提交 确实 创建一个新分支,它只是一个匿名分支。没有错。如果您担心标记头部,请使用书签。无需重写历史记录。不管你是否推送了更改。
    • @PaulS 这取决于您是更愿意使用命名分支还是书签。我更喜欢命名分支。