Mercurial樱桃采摘改变承诺

比方说,我对代码做了很多修改,只需要进行一些修改。 有没有办法做到这一点mercurial? 我知道darcs有这样一个function。

我知道hg transplant可以在分支之间做到这一点,但我需要这样的提交代码在当前分支,而不是从其他分支添加更改集时。

像乍得提到的MQ是一种方法。 还有更轻量级的解决scheme:

  • 与darcslogging大致相同的logging扩展名 。 它与mercurial分销。
  • Shelve扩展允许您“搁置”某些更改,允许您只提交一部分更改(未搁置的更改)

如果您使用的是Windows版的TortoiseHg 1.x ,则可以立即使用该function (不需要扩展名)。

  1. 运行TortoiseHg提交工具。
  2. select一个您只想提交其更改的子集的文件。
  3. 点击预览窗格中的“Hunk Selection”选项卡。
  4. 双击或使用空格键来切换提交中应包含哪些变化区块。

对于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 qpoppopup将堆栈中的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'”