Mercurial 樱桃采摘更改提交
-
21-08-2019 - |
题
比如说,我对代码做了很多更改,并且只需要提交其中的一些更改。Mercurial 有没有办法做到这一点?我知道 darcs
有这样一个功能。
我知道 hg transplant
可以在分支之间执行此操作,但我需要类似的东西来在当前分支中提交代码,而不是在从其他分支添加更改集时。
其他提示
如果您正在使用 乌龟汞 1.x 对于 Windows, 这个功能实现得很漂亮 开箱即用(无需扩展)。
- 运行 TortoiseHg 提交工具。
- 选择您只想提交其更改子集的文件。
- 单击“预览窗格”中的“ Hunk选择”选项卡。
- 双击或使用空格键切换哪些更改的大块应包括在提交中。
为了 乌龟汞2.x, ,“大块选择”选项卡现已消失。取而代之的是 搁置工具. 。它比旧的大块选择有更多的功能。这些新功能的代价是增加了一些复杂性。
请注意,使用此功能时无需显式启用 Mercurial Shelve 扩展。根据 Steve Borho(TortoiseHg 首席开发者)的说法 回答另一个 TortoiseHg 问题: “我们有搁置扩展的本地副本,可以直接调用它。”
为了 乌龟汞 2.7+, ,此功能已得到改进并重新引入。它现在直接内置到 Commit 工具中:
请注意,在左侧的文件列表中,顶部文件被选中以指示它将被包含,第二个文件未被选中,因为它不会被包含,第三个文件 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的'”强>