我试图在Mercurial合并两个脑袋。合并后,我没有提交并做了一些更改。然后我尝试提交并收到以下消息:
abort:无法部分提交合并(不指定文件或模式)
我使用TortoiseHG作为视觉外壳,并使用Beyond Compare进行比较和合并。而且我对所有人都比较陌生。
如何成功完成提交?
答案 0 :(得分:13)
Mercurial / TortoiseHg告诉您不应该部分提交合并。部分意味着您不会一次提交所有文件。
此消息的根本原因是,它会给您错误的结果。在Mercurial中合并两个更改集时,您将创建一个包含两个父更改集的新更改集。此合并变更集向其他人显示了您希望其他人如何组合这两个变更集。
让我们假设您从更改集A
和B
开始,并希望合并它们。这会创建一个如下图形:
... --- [A]
\
[M]
/
... --- [B]
假设我们在A!
变更集中添加了a.txt
行到A
,并在B!
中将b.txt
添加到B
变更。只是两个不冲突的独立变化。如果Mercurial允许您进行部分提交,那么您可以这样做:
hg merge
hg commit -m 'Added A!' a.txt # creates M
hg commit -m 'Added B!' b.txt # creates M'
结果如下图所示:
... --- [A] \ [M] --- [M'] / ... --- [B]
如果您沿路径b.txt
,B
,M
查看M'
,那么您会看到B!
中的B
行被引入{ {1}},已移除M
并重新引入M'
!
这不是您想要的合并变更集:部分合并会从一个分支中抛弃更改,只是为了在后续提交中再次引入它们。 Mercurial在您创建M
时信任您:它确实M
包含A
和B
的正确组合。特别是,如果在B!
中删除M
行,那么当您将M
与其他更改集合并时,它将保持不变。
因此,Mercurial试图通过不允许部分合并来保护您免于创建糟糕的历史记录。
答案 1 :(得分:7)
我认为你在hgrc文件中有别名。尝试删除[alias]部分并再次提交。
答案 2 :(得分:3)
我该怎么做才能完成提交 成功?
Mercurial(或git或任何其他DVCS)的一个好处是,您可以在开发过程中的任何时刻执行提交,它既快又私有。它会很快,因为您应该提交驻留在硬盘驱动器上的存储库的本地副本,并且它将是私有的,因为在您将它们推送到服务器(或其他主存储库)之前,没有人会看到您的更改集。
因此,要部分回答您的问题,适当的做法是在没有添加更改的情况下提交合并,然后应用并提交下一波更改。如果您使用TortoiseHG执行合并,它实际上会提示您在离开GUI之前提交合并,因为这是预期的HG工作流程。
话虽这么说,我对命名分支(即:新头)进行了一些更改,将其合并回默认分支,退出TortoiseHG GUI而不提交,进行了一些更改,然后提交没有问题。我会在原始查询下面提出一些澄清问题。
答案 3 :(得分:1)
我遇到了这个问题,因为我删除了一些文件。我还原了文件以恢复它们,然后能够提交。然后我删除了文件并进行了第二次提交。
答案 4 :(得分:0)
我遇到了同样的问题,我没有指定任何文件并使用命令行。
问题是我的.hgrc
中的[default]部分[defaults]
commit = -X project/web.config
因此,它默认为每个提交操作添加了特定文件。
查看您的默认部分,了解潜在问题。
答案 5 :(得分:0)
我遇到了同样的问题,我给出的命令是
hg commit -m与1234合并
我发现一段时间后,提交命令“与1234合并”必须用引号引起,因为命令将“与”和“ 1234”作为文件名参数。
请检查您的情况。