假设我有一个本地和远程Mercurial存储库。现在,我开始研究功能。我正在处理它,当我认为完成后,便提交变更集。经过更多测试,我发现可以通过调整代码中的某些内容来进一步改进此功能。我进行更改并提交。20分钟后,我发现此新功能存在一个错误,因此我将其修复并提交。
例如,我现在有3个变更集,我真的希望将其作为一个变更集推送到远程存储库,并带有消息“实施功能X”。
我怎么能没有太多麻烦呢?我相信我可以用补丁来做到这一点,但这似乎是很多工作。
假设我有一个本地和远程Mercurial存储库。现在,我开始研究功能。我正在处理它,当我认为完成后,便提交变更集。经过更多测试,我发现可以通过调整代码中的某些内容来进一步改进此功能。我进行更改并提交。20分钟后,我发现此新功能存在一个错误,因此我将其修复并提交。
例如,我现在有3个变更集,我真的希望将其作为一个变更集推送到远程存储库,并带有消息“实施功能X”。
我怎么能没有太多麻烦呢?我相信我可以用补丁来做到这一点,但这似乎是很多工作。
Answers:
如何在折叠扩展?
hg rebase --collapse
。在rebase命令中查看hg Wiki。由于这个问题是第3个整体搜索结果,也是第一个关于stackoverflow的搜索结果,因此我认为信息可能有用。
hg rebase
with --collapse
。
该histedit扩展正是你所期待的。
hg histedit -o
要么
hg histedit --outgoing
将显示即将发布的变更集的列表。从列表中可以
histedit会提示您输入折叠变更集的新提交消息,它默认为两条消息,用“ \ n *** \ n”分隔。
您还可以使用mq扩展名获得类似的结果,但这要困难得多。
您也可以使用折叠扩展名进行折叠,但是它不能提供出色的UI,也不能提供编辑结果提交消息的方法。编辑生成的提交消息还可以清理最终消息,这是我总是最终要利用的东西。
是的,您可以使用补丁来实现:假设您的工作在100到110的变更集中,包括
创建补丁:
% hg export -o mypatch 100:110 --git
更新至99:
% hg update 99
使用--no-commit应用补丁(否则,您将获得所有更改集):
% hg import --no-commit mypatch
一次提交所有更改:
% hg commit
现在,您有两个头(110和111),它们在您的工作目录中生成的文件应该相等–也许在删除旧文件之前先比较它们的合理性:
% hg strip 100
好吧,既然我已经把所有内容都拼出来了,它的确看起来很长,但是我自己做了很多次,我觉得它并不太繁琐...
hg strip --keep
然后一次提交所有内容呢?
hg strip
会将备份放在.hg/strip-backup/
目录中。我想这还不算安全,git reflog
但仍然可以提供某种救援。
我首选的使用mq进行折叠的方法是使用TortoiseHg ,如此处所述。但是,可以从命令行轻松完成,如下所示:
hg qimport -r <first>:<last>
-- where <first> and <last> are the first and last changesets
-- in the range of revisions you want to collapse
hg qpop <first>.diff
-- remove all except for the first patch from the queue
-- note: mq names patches <#>.diff when it imports them, so we're using that here
hg qfold <next>.diff
-- where <next> is <first>+1, then <first>+2, until you've reached <last>
hg qfinish -a
-- apply the folded changeset back into the repository
(执行qfold步骤可能有更好的方法,但我不知道,因为我通常对该操作使用TortoiseHg。)
乍一看似乎有些复杂,但是一旦您开始使用mq,它就非常简单自然,而且您还可以使用mq进行其他各种操作,非常方便!
hg collapse
并且hg histedit
是最好的方法。或者,如果它们可靠地工作,那将是最好的方法……我histedit
在三分钟之内就因堆栈转储而崩溃。Collapse
没有那么好。
以为我可能还会分享另外两个BKM:
hg rebase --collapse
此扩展与Mercurial一起分发。我还没有遇到任何问题。您可能需要玩一些游戏来解决hg rebase
局限性-基本上,它不喜欢在同一分支(命名分支或默认分支)上迁移到祖先,尽管如果在(命名)分支之间迁移也可以这样做。
将存储库(foo/.hg
)移至工作目录(bar
)及其文件。并非相反。
有人谈论过创建两个克隆树,并在它们之间复制文件。或在它们之间打补丁。相反,它更容易移动.hg
目录。
hg clone project work
... lots of edits
... hg pull, merge, resolve
hg clone project, clean
mv work/.hg .hg.work
mv clean/.hg work/.hg
cd work
... if necessary, pull, nerge, reconcile - but that would only happen because of a race
hg push
只要真正的存储库(.hg
树)独立于工作目录及其文件,此方法就起作用。
如果他们不是独立的...
histedit
是一个很好的选择。我仍然不信任它,因为我执行了git rebase -i,但是它不会崩溃..至少有些新版本会在出现严重错误的情况下将您留在temp分支上,因此只有一次删除变更集是在提交新分支之后。
我从未使用过Mercurial,但这听起来很像不久前Martin Fowler在他的博客上谈论的内容:
为什么不只是hg strip --keep
命令?
然后,您可以一次提交所有更改。
HistEdit可以完成您想要的操作,但是可能太过分了。如果您唯一需要的是将一些变更集折叠在一起,那么Collapse Extension将完成这项工作。
假设你有两个未公布THIS
,并THAT
在水银提交和他们一样加入到单在提交THIS
点::
... --> THIS --> ... --> THAT --> ... --> LAST
检查您的提交未发布::
$ hg glog -r "draft() & ($THIS | $THAT)"
更新LAST
提交::
$ hg up
并将导入提交THIS
到MQ ::
$ hg qimport $THIS::.
取消应用所有补丁,仅先应用THIS
::
$ hg qpop -a
$ hg qpush
$ hg qapplied
... THIS ...
加入THAT
::
$ hg qfold $THATNAME
注意要查找名称,请THATNAME
使用:
$ hg qseries
应用所有补丁并将其移至存储库历史记录::
$ hg qpush -a
$ hg qfinish -a
我关于主题的博客文章是Mercurial中的两次提交。