有一个提交不起作用,所以我想放弃它 而不是把它从历史中删除。
我已经更新了之前的修订版,并承诺,从而创造了一个新的头。
我没有分支,我不想要分支,我只是想简单地继续新的头部,没有花哨,没有合并,没有烦恼,只是继续忘记前一个。
我似乎找不到办法,而且我开始相信这是不可能的。我只找到了关于分支的东西,或者关于合并的东西。
您需要使用 hg backout。这将从任何子变更集中删除变更集所做的更改。
hg backout
看看这个,找个合理的解释。 反复无常的退出
用您想要忘记的修订版本将存储库更新到头部,然后使用 hg commit --close-branch将该(匿名)分支标记为已关闭。然后更新到您 做想要的分支的负责人,并继续工作。
hg commit --close-branch
如果对 hg heads使用 -c选项,您仍然可以看到关闭的分支,但是默认情况下它不会显示,而且 hg merge将知道不要尝试与关闭的磁头合并。
hg heads
-c
hg merge
在第一次将这个封闭的头推送到另一个存储库时,您将需要使用 hg push --force,因为当您推送时,实际上是在远程存储库中创建额外的头。因此,告诉 Mercurial,这是可以与 --force。人们谁拉闭合的头不会被任何警告打扰。
hg push --force
--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
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
然后,你可以这样做:
hg up -r 59 hg ci --close-branch -m "clean up heads; approach abandoned"
hg up -r 123 hg ci --close-branch -m "clean up heads; approach abandoned"
hg push
hg up -r 223
你完蛋了。
我曾多次遇到这种情况,当我想砍掉一个错误创造的人头时。我一直想看着它从地球上消失。
在你当地的复印件上,找到最新的,然后:
找到一个你想要去掉的头部的开头(一个新的颈部开始分叉的地方) ,得到修订号
脱掉。
资料来源: 小贴士和技巧。
资料来源: PruningDeadBranches # using _ Strip。
hg --config extensions.hgext.mq= strip -n <rev>
你的回购现在应该被剥头。最后一步很重要,因为剥离不会创建任何可以推送到中央存储库的更改。没有最后一步,你只能在局部剥离头部。
尼尔和尼克的回答都是正确的。因为我发现自己制造了许多悬空的脑袋,所以我最终写了一个化名,以便更容易地合上脑袋。把这个加到你的 .hgrc:
.hgrc
[alias] behead = !REV=$($HG id -i); $HG update $@ -q && $HG ci --close-branch -m "Closing dead head" && $HG update $REV -q
(如果您已经有一个 [alias]节,您可以改为附加到它)
[alias]
您现在可以在一个单一命令中关闭一个头(而不必手动更新到不同的变更集) ,如下所示:
$ hg behead 123
注意: 别名利用了 汞别名可以是 shell 命令。这意味着它可能只能在 UNIX 上工作,而不能在 Windows 上工作。
关闭或剥离不需要的分支的另一种方法是 合并,这种方法完全抛弃了它的效果,但将它留在历史中。这种方法将允许那些不需要的更改在推送中传播——所以只有在预期效果是这样的情况下才使用这种方法。
假设变更集的历史是这样的:
1-2-3-4-5-6 \ 7-8-*
而 5和 6则不再被需要。
5
6
你可以这样做:
hg up 8 hg merge -r 6 -t :local hg commit ...
它将创造这个:
1-2-3-4-5-6 \ \ 7-8-9-*
对 8的更新可以确保您在历史中处于所需的位置,并且您希望保留这个位置。
8
-t :local指示 hg 使用称为 本地的合并“工具”,它告诉 hg 忽略来自另一个分支的更改,即当前工作文件夹状态表示的 NOT。更多信息.
-t :local
因此,5和 6中不必要的变化被保存在历史中,但不会影响最近的任何事情。
这是 进化扩展的用例。它目前还没有与 Mercurial 绑定,所以从技术上来说它是第三方扩展。但是,包括 Mercurial 开发人员在内的一大批人正在大量使用它,而且正在积极开发之中,不会有什么进展。
通过 Evolution 扩展,您可以简单地做到这一点
hg prune -r revname
继续你的生活。衣柜还在,但已经过时了。除非您将 --hidden选项传递给 Mercurial 命令,否则它将不可见,并且默认情况下不会被推送到远程存储库。不过我觉得如果你想的话,你可以强迫自己。
--hidden
如果您正在修剪的 cset 具有您想要保留的祖先,那么您必须运行 hg evolve来重新设置这些变更集的基础。hg evolve将自动这样做。否则,你什么都不用做。
hg evolve