放弃更改而不删除历史记录

时间:2010-09-10 20:52:36

标签: mercurial

有一项提交无效,所以我想放弃而不将其从历史记录中删除

我已从早期版本更新并提交,从而创建了一个新的头。


我没有分支机构,我不想要分支机构,我只想简单地继续使用新的头部,没有花哨,没有合并,没有后顾之忧,只是继续忘记前一个。

我似乎无法找到如何做到这一点,我开始相信它无法完成。我发现的只是关于分支的东西,或者关于合并的东西。

9 个答案:

答案 0 :(得分:177)

使用您想要忘记的修订版将您的存储库更新到头部,然后使用--close-branch选项hg commit将该(匿名)分支标记为已关闭。然后更新到 想要的分支机构的负责人,并继续工作。

如果您对-c使用hg heads选项,仍然可以看到已关闭的分支,但默认情况下它不会显示,而hg merge会知道不会尝试合并闭着头。

首次将此封闭头部推送到另一个存储库时,您需要使用hg push --force,因为在推送时实际上是在远程存储库中创建了额外的头。所以告诉Mercurial --force这是可以的。拉开头部的人不会受到任何警告的困扰。

答案 1 :(得分:67)

我知道你现阶段想要与分支机构合作,但这正是你所做的。当你回到早期版本并提交一些有效的东西时,你创建了一个分支 - 一个未命名的分支,但是一个分支都是相同的。


没有问题,只是像你一样随身携带,而不是担心多头,但如果你想整理一下,所以你不小心选错了头,那么你可以杀死旧的分支

Mercurial文档中有一个很好的部分可以引导您完成Pruning Dead Branches周围的多个选项。

我认为最好的选择是将旧分支标记为“已关闭”。如果你的老头是修订版“123”那么:

hg update -r 123
hg commit --close-branch -m 'Closing old branch'
hg update -C default

答案 2 :(得分:20)

首先,输入:

hg heads

想象一下,你列出了三个头:

changeset:   223:d1c3deae6297
user:        Your name  <your@email.com>
date:        Mon Jun 09 02:24:23 2014 +0200
summary:     commit description #3

changeset:   123:91c5402959z3
user:        Your name <your@email.com>
date:        Sat Dec 23 16:05:38 2013 +0200
summary:     commit description #2

changeset:   59:81b9804156a8
user:        Your name <your@email.com>
date:        Sat Sep 14 13:14:40 2013 +0200
summary:     commit description #1

让我们说,你想让最后一个头保持活跃状态​​(223)并关闭其余部分。

然后你会这样做:

关闭头#59

hg up -r 59
hg ci --close-branch -m "clean up heads; approach abandoned"

关闭头#123

hg up -r 123
hg ci --close-branch -m "clean up heads; approach abandoned"

提交更改

hg push

不要忘记在最后切换到右边的头

hg up -r 223

你已经完成了。

答案 3 :(得分:12)

您想使用hg backout。这将从任何子变更集中删除变更集所做的更改。

检查一下这是一个很好的解释。 Mercurial Backout

答案 4 :(得分:2)

您可以将损坏的仓库克隆到新仓库,而无需克隆那些不需要的头。然后删除旧存储库,将新创建的克隆移动到原始位置并继续使用它。这将需要一些时间,但你会得到一个完全干净的存储库,而不会有不必要的修改。

hg clone --rev myGoodResition myDirtyRepo myCleanRepo

答案 5 :(得分:2)

Niall和Nick的答案都是直截了当的。因为我发现自己创造了许多摇头,所以我最终写了一个别名来更容易地关闭头部。将此添加到您的.hgrc

[alias]
behead = !REV=$($HG id -i); $HG update $@ -q && $HG ci --close-branch -m "Closing dead head" && $HG update $REV -q

(如果您已经有[alias]部分,则可以添加到其中)

您现在可以在一个单一命令中关闭一个头(而不必手动更新到另一个变更集),如下所示:

$ hg behead 123

注意:别名利用了Mercurial aliases can be shell commands这一事实。这意味着这可能只适用于UNIX,而不适用于Windows。

答案 6 :(得分:1)

关闭或剥离不需要的分支的另一种方法是合并,该方式完全丢弃其影响,但保留其历史记录。这种方法将允许那些不需要的更改在推送中传播-因此,只有在达到预期效果时才使用它。

比方说变更集的历史记录如下:

1-2-3-4-5-6    
       \    
        7-8-*

不再需要56

您可以这样做:

hg up 8
hg merge -r 6 -t :local
hg commit ...

将创建以下内容:

1-2-3-4-5-6    
       \   \
        7-8-9-*

8的更新可确保您在想要保留的历史记录中一直处于工作状态。

-t :local指示hg使用称为 local 的合并“工具”,该工具告诉它忽略来自另一个分支的更改,即,当前工作文件夹状态所表示的NOT 。 More info

因此56中不需要的更改会保留在历史记录中,但不会影响最近的更改。

答案 7 :(得分:1)

这是Evolve extension的用例。目前尚未与Mercurial捆绑在一起,因此从技术上讲它是第三方扩展。但是,包括Mercurial开发人员在内的很多人都在大量使用它,并且正在非常积极地开发它,并且它不会一事无成。

使用Evolve扩展程序,您只需完成

hg prune -r revname

继续生活。 cset将仍然存在,但已过时。除非您将--hidden选项传递给Mercurial命令,否则它将不可见,并且默认情况下不会将其推送到远程存储库。虽然我认为如果您确实愿意可以强制执行。

如果要修剪的cset具有要保留的祖先,则必须运行hg evolve来重新设置那些变更集的基础。 hg evolve将自动这样做。否则,您无需执行任何操作。

答案 8 :(得分:-1)

当我想要斩首错误创建的头时,我已多次遇到此问题。我一直希望看到它从地球表面消失。

在您的本地副本上,获取最新版本,然后:

  1. 找到要剥离的头部的开头(新颈部开始分支),获取修订号

  2. 剥去它。

  3. 来源:TipsAndTricks

    来源:PruningDeadBranches#Using_strip

    hg --config extensions.hgext.mq= strip -n <rev>
    
    1. 进行简单的文件更新(向文件添加空格),提交并推送。
    2. 你的回购现在应该剥头了。最后一步很重要,因为剥离不会创建任何可以推送到中央存储库的更改。如果没有最后一步,你只能在本地剥离头部。

相关问题