man*_*nsu 57 mercurial change-management
说,我对我的代码做了很多更改,只需要提交一些更改.有没有办法在mercurial中做到这一点?我知道darcs有这样一个功能.
我知道hg transplant可以在分支之间执行此操作,但是我需要这样的东西来提交当前分支中的代码而不是从其他分支添加更改集时.
mwo*_*e02 36
如果你使用TortoiseHg 1.x for Windows,这个功能开箱即用(不需要扩展).
对于TortoiseHg 2.x,Hunk Selection选项卡现已消失.取而代之的是Shelve工具.它具有比旧大块选择更多的功能.这些新功能的代价是增加了一些复杂性.

请注意,使用此功能时无需显式启用Mercurial Shelve扩展.据Steve Borho(TortoiseHg的首席开发人员)回应一个不同的TortoiseHg问题:"我们有一份本地版本的货架扩展并直接调用它."
对于TortoiseHg 2.7+,此功能已得到改进和重新引入.它现在直接构建在Commit工具中:

请注意,在左侧的文件列表中,检查顶部文件以指示它将被包含,第二个文件未选中,因为它不会被包含,第三个文件Sample.txt被填充(Null复选框指示符)因为只有从该文件中选择的更改才会包含在提交中.
将在图像的右下角更改选择部分中检查将包括的对Sample.txt的更改.将取消选中将被排除的更改,并且差异视图将显示为灰色.另请注意,搁置工具的图标仍然可用.
Gar*_*nso 17
我觉得我错过了一些东西,因为没有人建议这样做.
正常的"hg commit"命令可用于有选择地选择要提交的内容(您不必在本地工作目录中提交所有挂起的更改).
如果您有一组这样的更改:
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
Run Code Online (Sandbox Code Playgroud)
您只需提交其中两个更改即可...
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
Run Code Online (Sandbox Code Playgroud)
从命令行不是非常方便,因为您必须手动键入文件以有选择地提交(与像龟一样的GUI复选框过程),但是它就像它获得的那样简单并且不需要扩展.而文件全局可能有助于减少键入(如上所述,两个提交的文件在其路径名中唯一共享"liferay".
ric*_*chq 16
Mercurial Queues教程对于这个用例非常糟糕.我看到的所有示例都假设您还没有提交,并且您正在刷新一个补丁.大多数情况下情况并非如此,并且您有2或3次提交要压缩或以其他方式更改.
让我们说你有这样的历史:
---O---O---A---B---C
Run Code Online (Sandbox Code Playgroud)
第一个例子是压缩提交A,B和C.第一个init mq:
$ hg qinit
Run Code Online (Sandbox Code Playgroud)
现在我们需要将提交A,B和C"导入"到补丁队列中.让我们假设它们是最后3次提交.我们可以使用"-N"修订语法来导入它们,如下所示:
$ hg qimport -r -3:-1
Run Code Online (Sandbox Code Playgroud)
这意味着从3个补丁导入补丁到最后一次提交.您可以使用检查这些修补程序的状态hg qseries.它应该显示如下:
$ hg qseries
101.diff
102.diff
103.diff
Run Code Online (Sandbox Code Playgroud)
其中数字101,102和103对应于提交A,B和C的本地版本号现在,这些补丁应用,这意味着它们描述已经在工作副本的变化.您可以删除工作副本的更改并将其从提交历史中删除,仅使用通过补丁形式保存它们hg qpop.您可以说hg qpop; hg qpop要从堆栈中弹出更改C和B,或指定要"弹出到"的补丁.在这种情况下,它将是这样的:
$ hg qpop 101.diff
now at: 101.diff
Run Code Online (Sandbox Code Playgroud)
您现在在修补程序队列中有提交B和C的修补程序,但它们未应用(它们的更改已"丢失" - 它们仅存在于修补程序队列区域中).现在您可以将这些补丁折叠到最后一个补丁中,即我们创建一个新的提交,它相当于A + B + C的变化总和.
$ hg qfold -e 102.diff 103.diff
Run Code Online (Sandbox Code Playgroud)
这将显示您的编辑器,以便您可以更改提交消息.默认情况下,消息将是更改A,B和C的提交消息的串联,由星号分隔.这里的好处是,hg qfold如果你使用bash并且使用了hg-completion脚本,那么将选项卡完成补丁.这留下了这样的历史,其中A + B + C是单个提交,它是我们感兴趣的3个补丁的组合:
---O---O---A+B+C
Run Code Online (Sandbox Code Playgroud)
另一个用例是,如果我们有与以前相同的历史记录,但我们想要删除补丁B并合并A + C. 实际上这非常类似于上面.当你进入qfold步骤时,你只需在最后一次提交中折叠而不是最后两次提交:
$ hg qfold -e 103.diff
Run Code Online (Sandbox Code Playgroud)
这会在修补程序队列中保留B的更改,但它不会应用于工作副本,并且其提交不在历史记录中.你可以通过运行来看到这个:
$ hg qunapplied
102.diff
Run Code Online (Sandbox Code Playgroud)
历史现在看起来像这样,其中A + C是一个结合了更改A和C的提交:
---O---O---A+C
Run Code Online (Sandbox Code Playgroud)
最后一个用例可能是你只需要应用提交C.你可以通过运行上面的qimport来实现这一点,然后你会弹出你不想要的所有补丁:
$ hg qpop -a
Run Code Online (Sandbox Code Playgroud)
-a标志表示弹出所有补丁.现在你可以只应用你想要的那个:
$ hg qpush 103.diff
Run Code Online (Sandbox Code Playgroud)
这留给你这个历史:
---O---O---C
Run Code Online (Sandbox Code Playgroud)
一旦完成所有这些,您需要完成队列摆弄.这可以通过以下方式完成:
$ hg qfinish -a
Run Code Online (Sandbox Code Playgroud)
我们就是这样.您现在可以运行hg push并且只提交您想要的内容,或者提供hg email一个连贯的邮件列表补丁.
您可以使用随Mercurial一起分发的记录扩展名.
您需要先在~/.hgrc文件中启用它,方法是将其添加到以下[extensions]部分:
[extensions]
record=
Run Code Online (Sandbox Code Playgroud)
然后,只需键入hg record而不是hg commit,您将能够选择要提交哪些文件的更改.
您还可以使用crecord扩展,它提供了一个更好的界面来查看和选择更改.(但它并没有与Mercurial一起发布,而且我看到它偶尔会搞砸一次提交,所以它不是完全没有错误的.)