比方说,我有一个本地和远程Mercurial库。 现在,我开始一个功能工作。 我在这工作,当我认为它这样做,我提交变更。 测试多一点,我发现我可以进一步通过调整代码中的一些改善此功能。 我做出改变和承诺。 20分钟后,我发现有一个在这个新功能中的错误,所以我解决这个问题,并承诺这一点。
我现在有3次变更,我真的想推到远程存储库为一体的变更与消息“执行功能X”,例如。
我怎样才能做到这一点,没有什么麻烦? 我相信我可以用补丁做到这一点,但似乎很多工作。
比方说,我有一个本地和远程Mercurial库。 现在,我开始一个功能工作。 我在这工作,当我认为它这样做,我提交变更。 测试多一点,我发现我可以进一步通过调整代码中的一些改善此功能。 我做出改变和承诺。 20分钟后,我发现有一个在这个新功能中的错误,所以我解决这个问题,并承诺这一点。
我现在有3次变更,我真的想推到远程存储库为一体的变更与消息“执行功能X”,例如。
我怎样才能做到这一点,没有什么麻烦? 我相信我可以用补丁做到这一点,但似乎很多工作。
如何在折叠扩展 ?
该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提交(否则你会得到所有的变更回):
% hg import --no-commit mypatch
提交一次所有更改:
% hg commit
现在你有两个头(110和111),它应该在他们的工作目录中产生的文件的条款等同 - 也许diff的他们剥离旧的之前的理智:
% hg strip 100
好了,现在我已经阐明了这一切,它似乎长,但已经做了一堆次我自己,我不觉得这是太烦琐...
如果您正在使用TortoiseHg,使用可以只选择了两个版本(使用CTRL选择非后续的),点击右键,选择“压缩历史”。
之后,你会得到新的头从你之前选择的第一个变化开始一个新的变化列表,它将包含您所选择的那些之间的所有后代改变列表。
你可以简单地去掉旧改名单,如果你不需要他们了:使用MQ扩展它。 再次,在TortoiseHg:右键点击需要所有它的后代被剥离,“修改历史- >地带”第一次更改名单上。
我的优选使用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
是不是要好得多。
想我可能会分享另外两个BKMs:
hg rebase --collapse
这个扩展分布有水银。 我还没有与它的问题呢。 您可能需要玩一些游戏来解决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
树木,是独立的工作目录及其文件。
如果它们不是独立的?
我从来没有使用水银,但是这听起来很像是什么Martin Fowler的是在他的博客不是很久以前说起:
http://martinfowler.com/bliki/MercurialSquashCommit.html
为什么不hg strip --keep
命令?
然后你就可以提交所有更改为一个承诺。
HistEdit会做你想要什么,但它可能是矫枉过正。 如果你需要的仅仅是一些变更集折叠在一起的折叠扩展将做的工作。
假设你有两个未公布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
我的主题博客文章中加入水银两次提交 。
是的, strip --keep
作者的问题的作品。 但它是从别人略有不同,例如,如果从1到30有版本,但仅要崩溃版本12-15。 其他解决方案的工作,但不能strip --keep
。