不从历史中删除而放弃更改

有一个提交不起作用,所以我想放弃它 而不是把它从历史中删除

我已经更新了之前的修订版,并承诺,从而创造了一个新的头。


我没有分支,我不想要分支,我只是想简单地继续新的头部,没有花哨,没有合并,没有烦恼,只是继续忘记前一个。

我似乎找不到办法,而且我开始相信这是不可能的。我只找到了关于分支的东西,或者关于合并的东西。

55198 次浏览

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

看看这个,找个合理的解释。 反复无常的退出

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

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

在第一次将这个封闭的头推送到另一个存储库时,您将需要使用 hg push --force,因为当您推送时,实际上是在远程存储库中创建额外的头。因此,告诉 Mercurial,这是可以与 --force。人们谁拉闭合的头不会被任何警告打扰。

我知道在这个阶段 想要不能和分支机构一起工作,但这正是你所做的。当您返回到早期版本并提交了一些有效的东西时,您创建了一个分支——一个未命名的分支,但仍然是一个分支。


继续你的生活没有任何问题,也不用担心有多个头,但是如果你想把事情整理好,这样你就不会一不小心选错了头,那么你就可以把老树枝杀掉。

Mercurial 文档中有一个很好的部分,它将带您了解关于 修剪枯枝的许多选项。

我认为对你来说最好的选择是将旧分行标记为“关闭”。如果你的旧脑袋是修订版“123”,那么:

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

您可以克隆您的损坏回购到一个新的,而不克隆那个不想要的头。然后删除旧存储库,将新创建的克隆移动到原始位置并继续使用它。这将花费一些时间,但是您将得到一个完全干净的存储库,而没有不需要的修订的迹象。

hg clone --rev myGoodResition myDirtyRepo myCleanRepo

首先,输入:

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

你完蛋了。

我曾多次遇到这种情况,当我想砍掉一个错误创造的人头时。我一直想看着它从地球上消失。

在你当地的复印件上,找到最新的,然后:

  1. 找到一个你想要去掉的头部的开头(一个新的颈部开始分叉的地方) ,得到修订号

  2. 脱掉。


资料来源: 小贴士和技巧

资料来源: PruningDeadBranches # using _ Strip

hg --config extensions.hgext.mq= strip -n <rev>
  1. 做一个简单的文件更新(向文件添加空格) ,提交和推送。

你的回购现在应该被剥头。最后一步很重要,因为剥离不会创建任何可以推送到中央存储库的更改。没有最后一步,你只能在局部剥离头部。

尼尔和尼克的回答都是正确的。因为我发现自己制造了许多悬空的脑袋,所以我最终写了一个化名,以便更容易地合上脑袋。把这个加到你的 .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

注意: 别名利用了 汞别名可以是 shell 命令。这意味着它可能只能在 UNIX 上工作,而不能在 Windows 上工作。

关闭或剥离不需要的分支的另一种方法是 合并,这种方法完全抛弃了它的效果,但将它留在历史中。这种方法将允许那些不需要的更改在推送中传播——所以只有在预期效果是这样的情况下才使用这种方法。

假设变更集的历史是这样的:

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 使用称为 本地的合并“工具”,它告诉 hg 忽略来自另一个分支的更改,即当前工作文件夹状态表示的 NOT。更多信息.

因此,56中不必要的变化被保存在历史中,但不会影响最近的任何事情。

这是 进化扩展的用例。它目前还没有与 Mercurial 绑定,所以从技术上来说它是第三方扩展。但是,包括 Mercurial 开发人员在内的一大批人正在大量使用它,而且正在积极开发之中,不会有什么进展。

通过 Evolution 扩展,您可以简单地做到这一点

hg prune -r revname

继续你的生活。衣柜还在,但已经过时了。除非您将 --hidden选项传递给 Mercurial 命令,否则它将不可见,并且默认情况下不会被推送到远程存储库。不过我觉得如果你想的话,你可以强迫自己。

如果您正在修剪的 cset 具有您想要保留的祖先,那么您必须运行 hg evolve来重新设置这些变更集的基础。hg evolve将自动这样做。否则,你什么都不用做。