有一项提交无效,所以我想放弃而不将其从历史记录中删除。
我已从早期版本更新并提交,从而创建了一个新的头。
我没有分支机构,我不想要分支机构,我只想简单地继续使用新的头部,没有花哨,没有合并,没有后顾之忧,只是继续忘记前一个。
我似乎无法找到如何做到这一点,我开始相信它无法完成。我发现的只是关于分支的东西,或者关于合并的东西。
答案 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
然后你会这样做:
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
你已经完成了。
答案 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-*
不再需要5
和6
。
您可以这样做:
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。
因此5
和6
中不需要的更改会保留在历史记录中,但不会影响最近的更改。
答案 7 :(得分:1)
这是Evolve extension的用例。目前尚未与Mercurial捆绑在一起,因此从技术上讲它是第三方扩展。但是,包括Mercurial开发人员在内的很多人都在大量使用它,并且正在非常积极地开发它,并且它不会一事无成。
使用Evolve扩展程序,您只需完成
hg prune -r revname
继续生活。 cset将仍然存在,但已过时。除非您将--hidden
选项传递给Mercurial命令,否则它将不可见,并且默认情况下不会将其推送到远程存储库。虽然我认为如果您确实愿意可以强制执行。
如果要修剪的cset具有要保留的祖先,则必须运行hg evolve
来重新设置那些变更集的基础。 hg evolve
将自动这样做。否则,您无需执行任何操作。
答案 8 :(得分:-1)
当我想要斩首错误创建的头时,我已多次遇到此问题。我一直希望看到它从地球表面消失。
在您的本地副本上,获取最新版本,然后:
找到要剥离的头部的开头(新颈部开始分支),获取修订号
剥去它。
来源:TipsAndTricks。
来源:PruningDeadBranches#Using_strip。
hg --config extensions.hgext.mq= strip -n <rev>
你的回购现在应该剥头了。最后一步很重要,因为剥离不会创建任何可以推送到中央存储库的更改。如果没有最后一步,你只能在本地剥离头部。