Mercurial樱桃采摘改变承诺
比方说,我对代码做了很多修改,只需要进行一些修改。 有没有办法做到这一点mercurial? 我知道darcs
有这样一个function。
我知道hg transplant
可以在分支之间做到这一点,但我需要这样的提交代码在当前分支,而不是从其他分支添加更改集时。
像乍得提到的MQ是一种方法。 还有更轻量级的解决scheme:
- 与darcslogging大致相同的logging扩展名 。 它与mercurial分销。
- Shelve扩展允许您“搁置”某些更改,允许您只提交一部分更改(未搁置的更改)
如果您使用的是Windows版的TortoiseHg 1.x ,则可以立即使用该function (不需要扩展名)。
- 运行TortoiseHg提交工具。
- select一个您只想提交其更改的子集的文件。
- 点击预览窗格中的“Hunk Selection”选项卡。
- 双击或使用空格键来切换提交中应包含哪些变化区块。
对于TortoiseHg 2.x ,Hunk Selection选项卡现在不见了。 取而代之的是Shelve工具 。 它具有比旧的大块select更多的function。 这些新function是以增加复杂性为代价的。
请注意,使用此function时不需要显式启用Mercurial Shelve扩展。 根据TortoiseHg开发者Steve Borho的说法,他回应了一个不同的TortoiseHg问题 : “我们有一个本地副本,并直接调用它。”
对于TortoiseHg 2.7+ ,这个function已经被改进和重新引入。 它现在直接构build到Commit工具中:
请注意,在左侧的文件列表中,顶部文件被选中以表示将被包含,第二个文件被取消选中,因为它不会被包含,第三个文件Sample.txt被填充(Nullcheckbox指示符)因为只有从该文件中select的更改将包含在提交中。
在图像的右下angular更改select部分检查将要包括的对Sample.txt的更改。 将被排除的更改将被取消选中,差异视图将变灰。 另请注意,搁置工具的图标仍然可用。
Mercurial Queues教程对于这个用例来说是很糟糕的。 我所见过的所有例子都假设你还没有提交,你正在刷新一个补丁。 大多数时候情况并非如此,你有两到三次提交你想压缩在一起,或以其他方式改变。
可以说你有这样的历史:
---O---O---A---B---C
第一个例子是压缩提交A,B和C.第一个初始化mq:
$ hg qinit
现在我们需要将提交A,B和C“导入”补丁队列。 让我们假设他们是最后3个提交。 我们可以使用“-N”修订语法来导入它们,如下所示:
$ hg qimport -r -3:-1
这意味着从3个补丁导入补丁到最后一个补丁。 你可以用hg qseries
检查这些补丁的状态。 它应该显示这样的东西:
$ hg qseries 101.diff 102.diff 103.diff
数字101,102和103与提交A,B和C的本地修订号相对应。现在应用这些修补程序,这意味着它们所描述的更改已经在工作副本中。 你可以摆脱工作副本的变化,并将其从提交历史logging中删除,仅通过使用hg qpop
将其保存为补丁forms。 你可以说hg qpop; hg qpop
hg qpop; hg qpop
popup将堆栈中的C和B改变,或者指定一个补丁来“popup”。 在这种情况下,它会是这样的:
$ hg qpop 101.diff now at: 101.diff
您现在已经在修补程序队列中提交了提交B和C的修补程序,但是这些修补程序未应用(其更改已“丢失” – 它们只存在于修补程序队列区域中)。 现在,您可以将这些补丁折叠到最后一个补丁中,也就是说,我们创build了一个新的提交,它等于A + B + C的变化总和。
$ hg qfold -e 102.diff 103.diff
这将显示您的编辑器,以便您可以更改提交消息。 默认情况下,消息将是变化A,B和C的提交消息的串联,用星号分隔。 这里的hg qfold
是,如果你使用bash并且有hg-completion脚本来源的话, hg qfold
会制作补丁。 这留下了这样的历史,其中A + B + C是一个单独的提交,它是我们感兴趣的3个补丁的组合:
---O---O---A+B+C
另一个用例是,如果我们有和以前一样的历史logging,但是我们要删除补丁B并合并A + C。 这实际上与上面非常相似。 当你到达qfold步骤时,你会简单地折叠最后一次提交而不是最后2次提交:
$ hg qfold -e 103.diff
这会在修补程序队列中保留B的更改,但不会应用于工作副本,并且其提交不在历史logging中。 你可以看到这个运行:
$ hg qunapplied 102.diff
历史现在看起来像这样,其中A + C是结合变化A和C的单个提交:
---O---O---A+C
最后的用例可能是你只需要应用C提交。你可以通过像上面那样运行qimport来做到这一点,你将popup所有你不想要的补丁:
$ hg qpop -a
-a标志意味着popup所有的补丁。 现在你可以申请一个你想要的:
$ hg qpush 103.diff
这给你留下了这个历史:
---O---O---C
一旦你完成了这一切,你需要完成队列摆弄。 这可以通过以下方式完成:
$ hg qfinish -a
所以我们就是。 您现在可以运行hg push
,只按照您想要的方式提交,或者hg email
向邮件列表hg email
连贯的补丁。
我觉得我错过了一些东西,因为没有人已经提出这个问题。
可以使用普通的“hg commit”命令select要提交的内容(不必在本地工作目录中提交所有待处理的更改)。
如果你有这样一组更改:
M ext-web/docroot/WEB-INF/liferay-display.xml M ext-web/docroot/WEB-INF/liferay-portlet-ext.xml M ext-web/docroot/WEB-INF/portlet-ext.xml
你可以只提交这两个变化…
hg commit -m "partial commit of working dir changes" ext-web/docroot/WEB-INF/liferay-display.xml ext-web/docroot/WEB-INF/liferay-portlet-ext.xml
从命令行不是非常方便的,因为你必须手动input文件来select性地提交(与像龟一样的GUIcheckbox过程),但是它是一样的直接,因为它不需要扩展。 文件匹配可能有助于减lessinput(如上所述,两个提交的文件在path名中唯一地共享“liferay”。
您可以使用随Mercurial分发的logging扩展名 。
您需要首先在~/.hgrc
文件中启用它,方法是将其添加到[extensions]
部分:
[extensions] record=
然后,只需inputhg record
而不是hg commit
,就可以select要提交哪些文件的更改。
您也可以使用提供更好界面的crecord扩展程序来查看和select更改。 (虽然没有与Mercurial分发,但我偶尔会看到它搞砸了一个提交,所以它不是完全没有bug的。)
我相信Mercurial队列充满了Mercurial的angular色。 这里有一个相当不错的教程 。
尝试qct(Qt提交工具)。 它有一个“select更改”function,启动一个3路合并工具,为您撤消个人更改。 在你提交之后,那些你“没有了解”的变化就会回来。
我使用commit-patch 。 这是一个脚本,可以让你在提交之前编辑差异。 Emacs的diff模式和vc模式真的很棒。
在过去,我使用了crecord,但它有与unicode相关的错误(实际上logging扩展名有bug,crecord依赖于)。
一段时间过去了。 看来现在最好的select是hg commit --interactive
首先,你必须忘记你所知道的关于GUI的一切,然后返回到命令行。 接下来从命令行执行此操作:
hg stat> filelist.txt
这将所有修改后的文件转换为名为filelist.txt的文本文件
接下来编辑你的文件列表,只包含你想提交的文件。
最后使用fileset sytnax提交:
hg commit“set:'listfile:test.txt'”