比如说,我对代码做了很多更改,并且只需要提交其中的一些更改。Mercurial 有没有办法做到这一点?我知道 darcs 有这样一个功能。

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

有帮助吗?

解决方案

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

  • 记录扩展 其工作方式与 darcs record 大致相同。它是随 Mercurial 一起分发的。
  • 货架延伸 它允许您“搁置”某些更改,从而允许您仅提交更改的子集(未搁置的更改)

其他提示

如果您正在使用 乌龟汞 1.x 对于 Windows, 这个功能实现得很漂亮 开箱即用(无需扩展)。

  1. 运行 TortoiseHg 提交工具。
  2. 选择您只想提交其更改子集的文件。
  3. 单击“预览窗格”中的“ Hunk选择”选项卡。
  4. 双击或使用空格键切换哪些更改的大块应包括在提交中。

为了 乌龟汞2.x, ,“大块选择”选项卡现已消失。取而代之的是 搁置工具. 。它比旧的大块选择有更多的功能。这些新功能的代价是增加了一些复杂性。

enter image description here

请注意,使用此功能时无需显式启用 Mercurial Shelve 扩展。根据 Steve Borho(TortoiseHg 首席开发者)的说法 回答另一个 TortoiseHg 问题: “我们有搁置扩展的本地副本,可以直接调用它。”


为了 乌龟汞 2.7+, ,此功能已得到改进并重新引入。它现在直接内置到 Commit 工具中:

example of change selection in the commit tool

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

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

在水银队列教程是可怕对于这种使用情况。我看到所有的例子假定你还没有做出承诺和您刷新了单个补丁。这其中大部分的时间是不是这样的,你必须要一起壁球或以其他方式改变2次或3的提交。

假设你有这种历史的:

---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的本地版本号现在,这些补丁的施加的,这意味着它们所描述的变化已经在工作副本。你可以摆脱这些变化的工作拷贝,并从提交的历史记录中删除,从而节省他们只有补丁的形式,通过使用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-完成脚本来源。这留下这样的,其中A + B + C是单个提交即3个补丁我们感兴趣的组合的历史:

---O---O---A+B+C

另一种使用情况是,如果我们像以前一样有相同类型的历史,但我们想删除补丁B和合并A + C。这是非常类似于上面其实。当你到了qfold一步,你只会均价在最后一次提交,而不是过去的2个提交:

$ hg qfold -e 103.diff

这留下了乙在补丁队列的变化,但它不被施加到工作副本和它的提交不在历史。您可以通过运行看到这一点:

$ 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 的连贯补丁到邮件列表。

我觉得我失去了一些东西,因为没有人说得清这了。

在正常的“汞承诺”命令可用于有选择性地选择犯了什么(你没有犯在本地工作目录中的所有挂起的更改)。

如果有一组像这样变化的:

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

不超在命令行方便,因为你必须手工输入文件选择性提交(VS像乌龟GUI复选框过程),但它是我们所直接了当的,不需要扩展。和文件通配符也许可以帮助减少打字(因为它会上面,无论是提交的文件在其路径名唯一共享“的Liferay”。

可以使用记录扩展,该分布与水银

您需要启用它在你的~/.hgrc文件首先,通过将其添加到[extensions]部分:

[extensions]
record=

然后,只需键入hg record代替hg commit,您将能够选择哪些更改哪些文件要提交。

您还可以使用href="https://www.mercurial-scm.org/wiki/CrecordExtension" rel="nofollow"> crecord扩展程序它提供了一个更好的接口,审查和选择

一段时间已经过去。似乎是最好的选择现在hg commit --interactive

我相信水银队列填补这个角色的水银。有一个很好的教程链接存在。

尝试QCT(Qt的提交工具)。它有一个“选择改变”功能,启动了3路合并工具,您可以撤消个别更改。你提交之后,那些你“解开”修改回来。

我使用提交补丁。这是一个脚本,让你在提交之前编辑的差异。这是非常好的使用Emacs的DIFF模式和VC-模式。

在过去我使用crecord,但它涉及到的unicode臭虫(实际上是记录延伸部具有的错误,这crecord取决于)。

首先,你必须忘掉你曾经知道GUI的一切,回到命令行。从命令行下一个做到这一点:

<强>汞柱stat>的Filelist.txt中

这管你的所有修改过的文件到一个文本文件名为Filelist.txt中

接下来编辑您的文件列表,以仅包含这些文件要提交。

最后提交使用文件集sytnax:

<强>汞柱提交 “设置: 'listfile中:test.txt的'”

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top