有一个提交只是行不通,所以我想放弃它而不将其从历史记录中删除。
我已经从较早的修订版进行了更新并做出了承诺,因此创建了一个新的负责人。
我没有分支,我不需要分支,我只想简单地按原样继续使用新的头,没有花哨,没有合并,没有后顾之忧,只是忘记了上一个。
我似乎找不到解决方法,而且我开始相信它无法完成。我所发现的只是关于分支的东西,或是关于合并的东西。
有一个提交只是行不通,所以我想放弃它而不将其从历史记录中删除。
我已经从较早的修订版进行了更新并做出了承诺,因此创建了一个新的负责人。
我没有分支,我不需要分支,我只想简单地按原样继续使用新的头,没有花哨,没有合并,没有后顾之忧,只是忘记了上一个。
我似乎找不到解决方法,而且我开始相信它无法完成。我所发现的只是关于分支的东西,或是关于合并的东西。
Answers:
使用您要忘记的修订版本将您的存储库更新到开头,然后使用hg commit --close-branch
将该分支(匿名)标记为已关闭。然后更新到您分支的负责人都想要的,并继续工作。
如果使用-c
选项hg heads
,您仍然可以看到封闭的分支,但是默认情况下它不会显示,并且hg merge
不会尝试与封闭的头合并。
您将需要使用hg push --force
第一次将这个封闭的磁头推到另一个存储库中,因为在您推送时实际上是在远程存储库中创建其他磁头。因此,告诉Mercurial可以--force
。拉紧头部的人不会受到任何警告的困扰。
hg heads
……我正在使用水银1.4.3,这是一个较新的功能吗?
hg branches
仍应显示您所在的分支名称。与其尝试关闭分支,不如将您的匿名分支合并回原始分支,放弃所有更改。
我知道您目前不希望使用分支机构,但这正是您所做的。当您回到较早的版本并提交了有效的命令后,您创建了一个分支-一个未命名的分支,但是一个分支都一样。
保持原样进行并没有担心多头的问题,但没有问题,但是如果您要整理事物,以免一次不小心选错头,则可以杀死旧分支。
Mercurial文档中有一个不错的部分,它带您了解有关修剪死枝的许多选择。
我认为对您来说最好的选择是将旧分支标记为“已关闭”。如果您的老头是修订版“ 123”,则:
hg update -r 123
hg commit --close-branch -m 'Closing old branch'
hg update -C default
-C
的hg update
?似乎没有文件会被修改,因此没有它就可以工作。
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
这样就完成了。
--close-branch -m "Closing branch - technique #2 abandoned in favor of technique #3"
。
hg up -r 223
先进行任何更改。
hg push --force
,而不仅仅是hg push
克服关于多头的警告。
hg push
它本身对我不起作用。如果外部仓库因多个头而拒绝,您如何建议将更改推送到外部仓库?
您要使用hg backout
。这将从所有子变更集中删除变更集所做的更改。
检查一下,以获得良好的解释。 汞回收
尼尔和尼克的答案都是直接的。因为我发现自己创建了许多悬垂的头部,所以我最终写了一个别名来更轻松地闭合头部。通过添加到您的.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别名可以是shell命令的事实。这意味着这可能仅适用于UNIX,不适用于Windows。
关闭或剥离不需要的分支的替代方法是将其合并,以完全丢弃其影响,但将其保留在历史中。这种方法将允许那些不需要的更改在推送中传播-因此,只有在达到预期效果时才使用此方法。
假设变更集的历史记录如下所示:
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使用称为本地的合并“工具” ,该工具告诉它忽略来自另一个分支的更改,即,当前工作文件夹状态所表示的NOT。更多信息。
因此,在不需要的变化5
,并6
保留在历史,但不影响任何东西更近一些。
这是Evolve扩展的用例。目前尚未与Mercurial捆绑在一起,因此从技术上讲它是第三方扩展。但是,包括Mercurial开发人员在内的许多人都在大量使用它,并且正在非常积极地开发它,并且它不会一事无成。
使用Evolve扩展程序,您只需
hg prune -r revname
并继续生活。cset仍将在那里,但已过时。除非您通过--hidden
选项给Mercurial命令,,并且默认情况下不会将其推送到远程存储库。虽然我认为您可以强制执行此操作。
如果要修剪的cset具有要保留的祖先,则必须运行hg evolve
以重新设置这些变更集的基准。hg evolve
将自动执行此操作。否则,您无需执行任何操作。
当我要斩首一个错误创建的头部时,我已经多次遇到此问题。我一直想看到它从地球表面消失。
在本地副本上,获取最新版本,然后:
找到要剥离的头的起点(新的脖子开始分支),获取修订号
剥离它。
资料来源:TipsAndTricks。
来源:PruningDeadBranches#Using_strip。
hg --config extensions.hgext.mq= strip -n <rev>
现在,您的仓库已经剥了头。最后一步很重要,因为剥离不会创建任何可推送到中央存储库的更改。如果没有最后一步,您只能在本地剥离头部。