说,我对我的代码进行了很多更改,只需要提交一些更改。有没有办法在mercurial中做到这一点?我知道darcs
有这样的功能。
我知道hg transplant
可以在分支之间执行此操作,但我需要这样的内容来提交当前分支中的代码,而不是在从其他分支添加更改集时。
答案 0 :(得分:36)
如果您对Windows使用 TortoiseHg 1.x ,则开箱即用this feature is implemented beautifully(不需要扩展名)。
对于 TortoiseHg 2.x ,Hunk Selection标签现已消失。取而代之的是Shelve tool。它具有比旧大块选择更多的功能。这些新功能的代价是增加了一些复杂性。
请注意,使用此功能时无需显式启用Mercurial Shelve扩展。根据{{3}}中的首席TortoiseHg开发人员Steve Borho的说法:“我们有一个本地版本的搁置扩展并直接调用它。”
对于 TortoiseHg 2.7 + ,此功能已得到改进和重新引入。它现在直接构建在Commit工具中:
请注意,在左侧的文件列表中,检查顶部文件以指示它将被包含,第二个文件未选中,因为它不会被包含,第三个文件Sample.txt被填充(Null)复选框指示符)因为只有从该文件中选择的更改才会包含在提交中。
在图像的右下方更改选择部分中检查将包含的Sample.txt的更改。将取消选中将被排除的更改,并且差异视图将显示为灰色。另请注意,搁架工具的图标仍然可用。
答案 1 :(得分:34)
乍得提到的MQ是一种方式。还有更轻量级的解决方案:
答案 2 :(得分:16)
Mercurial Queues教程对于这个用例非常糟糕。我看到的所有示例都假设您还没有提交,并且您正在刷新一个补丁。大多数情况下情况并非如此,并且您有2或3次提交要压缩或以其他方式更改。
让我们说你有这样的历史:
---O---O---A---B---C
第一个例子是压缩提交A,B和C. First init 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的本地修订号。现在这些修补程序应用,这意味着它们描述的更改已经在工作副本。您可以删除工作副本的更改并将其从提交历史中删除,仅使用hg qpop
以修补程序形式保存它们。您可以说hg qpop; hg qpop
将更改C和B弹出堆栈,或指定要“弹出”的补丁。在这种情况下,它将是这样的:
$ hg qpop 101.diff
now at: 101.diff
现在,您已在修补程序队列中获得了提交B和C的修补程序,但它们未应用(它们的更改已“丢失” - 它们仅存在于修补程序队列区域中)。现在您可以将这些补丁折叠到最后一个补丁中,即我们创建一个新的提交,它相当于A + B + C的变化总和。
$ hg qfold -e 102.diff 103.diff
这将显示您的编辑器,以便您可以更改提交消息。默认情况下,消息将是更改A,B和C的提交消息的串联,由星号分隔。这里的好处是hg qfold
将使用bash选项卡完成补丁,并使用hg-completion脚本。这留下了这样的历史,其中A + B + C是一个提交,它是我们感兴趣的3个补丁的组合:
---O---O---A+B+C
另一个用例是,如果我们有与以前相同的历史记录,但我们想要删除补丁B并合并A + C.实际上这非常类似于上面。当你进入qfold步骤时,你只需在最后一次提交中折叠而不是最后两次提交:
$ hg qfold -e 103.diff
这会在修补程序队列中保留B的更改,但它不会应用于工作副本,并且其提交不在历史记录中。你可以通过运行来看到这个:
$ hg qunapplied
102.diff
历史记录现在看起来像这样,其中A + C是一个结合了变更A和C的提交:
---O---O---A+C
最后一个用例可能是你只需要应用提交C.你可以通过运行上面的qimport来做到这一点,然后你会弹出你不想要的所有补丁:
$ hg qpop -a
-a标志表示弹出所有补丁。现在你可以只应用你想要的那个:
$ hg qpush 103.diff
这给你留下了这段历史:
---O---O---C
完成所有这些后,您需要完成队列摆弄。这可以通过以下方式完成:
$ hg qfinish -a
所以我们有。您现在可以运行 hg push
并且只提交您想要的内容,或者 hg email
一个连贯的补丁到邮件列表。
答案 3 :(得分:16)
我觉得我错过了一些东西,因为没有人提出过这个问题。
正常的“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
您可以使用...
提交其中两项更改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
从命令行不是非常方便,因为你必须手动输入文件以选择性地提交(与像龟一样的GUI检查框过程),但它就像它获得的那样简单并且不需要扩展。而文件全局可能有助于减少输入(如上所述,两个提交的文件在其路径名中唯一共享“liferay”。
答案 4 :(得分:7)
您可以使用随Mercurial一起发布的record extension。
您需要先在~/.hgrc
文件中启用它,方法是将其添加到[extensions]
部分:
[extensions]
record=
然后,只需键入hg record
而不是hg commit
,您就可以选择要提交哪些文件的更改。
您还可以使用提供更好界面的crecord extension来查看和选择更改。 (但它并没有随Mercurial一起发布,而且我看到它偶尔会搞砸一次提交,所以它不是完全没有错误的。)
答案 5 :(得分:5)
过了一段时间。似乎现在最好的选择是hg commit --interactive
答案 6 :(得分:3)
我相信Mercurial Queues填补了Mercurial的这个角色。那里有a pretty good tutorial个链接。
答案 7 :(得分:2)
尝试qct(Qt Commit Tool)。它具有“选择更改”功能,可启动3向合并工具,以便您撤消个别更改。提交后,您“撤消”的更改将返回。
答案 8 :(得分:2)
我使用commit-patch。这是一个脚本,允许您在提交之前编辑差异。使用Emacs的diff-mode和vc-mode非常好。
过去我使用了crecord,但它有与unicode相关的bug(实际上记录扩展有bug,这是crecord所依赖的)。
答案 9 :(得分:-1)
首先,您必须忘记所有关于GUI的知识并返回命令行。从命令行接下来执行以下操作:
hg stat> Filelist.txt中强>
这会将所有修改过的文件传输到名为filelist.txt
的文本文件中接下来编辑您的文件列表,仅包含您要提交的文件。
最后使用文件集sytnax提交:
hg commit“set:'listfile:test.txt'”