Mercurial cherry采取改变提交

时间:2009-05-12 21:23:27

标签: mercurial change-management

说,我对我的代码进行了很多更改,只需要提交一些更改。有没有办法在mercurial中做到这一点?我知道darcs有这样的功能。

我知道hg transplant可以在分支之间执行此操作,但我需要这样的内容来提交当前分支中的代码,而不是在从其他分支添加更改集时。

10 个答案:

答案 0 :(得分:36)

如果您对Windows使用 TortoiseHg 1.x ,则开箱即用this feature is implemented beautifully(不需要扩展名)。

  1. 运行TortoiseHg提交工具。
  2. 选择仅限您的文件 想要提交它的一个子集 变化。
  3. 点击Hunk 预览窗格中的“选择”选项卡。
  4. 双击或使用空格键 改变帅哥的切换应该是 包含在提交中。

  5. 对于 TortoiseHg 2.x ,Hunk Selection标签现已消失。取而代之的是Shelve tool。它具有比旧大块选择更多的功能。这些新功能的代价是增加了一些复杂性。

    enter image description here

    请注意,使用此功能时无需显式启用Mercurial Shelve扩展。根据{{​​3}}中的首席TortoiseHg开发人员Steve Borho的说法:“我们有一个本地版本的搁置扩展并直接调用它。”


    对于 TortoiseHg 2.7 + ,此功能已得到改进和重新引入。它现在直接构建在Commit工具中:

    example of change selection in the commit tool

    请注意,在左侧的文件列表中,检查顶部文件以指示它将被包含,第二个文件未选中,因为它不会被包含,第三个文件Sample.txt被填充(Null)复选框指示符)因为只有从该文件中选择的更改才会包含在提交中。

    在图像的右下方更改选择部分中检查将包含的Sample.txt的更改。将取消选中将被排除的更改,并且差异视图将显示为灰色。另请注意,搁架工具的图标仍然可用。

答案 1 :(得分:34)

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

  • Record extension的工作方式与darcs记录大致相同。它与mercurial一起发行。
  • Shelve extension允许您“搁置”某些更改,允许您只提交更改的一部分(未被搁置的部分)

答案 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'”