我创建了一个repo并对文件进行了一些更改。然后我承诺并继续工作。一些变化,我再次承诺。 我不得不回到第一个版本,所以我做了:
hg up 5f01300
第一版的文件又回来了。
我做了一些改变并再次承诺。
hg commit -m 'Updated'
创建了一个新头,然后我尝试了:
hg push
Mercurial说有“未提交的未提交的”东西。
我试图再次提交:
hg commit -m 'Changes accepted'
然后我打字:
hg merge
所以出现了很多错误,因为有两个头,我无法合并它们。
有时候我尝试像上面那样合并,但效果很好。通常在我第二次尝试重复这个过程时,它会中断,我无法合并任何内容。
有人能教会如何正确合并吗?
通常,第二次发生这种情况:
int main(int argc, char **argv)
{
printf("hello, world!\n");
<<<<<<< local
printf("sure am glad I'm not using CVS!\n");
=======
printf("sure am glad I'm using Mercurial!\n");
>>>>>>> other
return 0;
}
我必须这样做:
hg resolve -m hello.c
答案 0 :(得分:4)
合并是您如何组合文件的不同版本。每当您以两种不同的方式更改文件时,Mercurial会在您运行hg merge
时尝试合并它。
当文件更改不重叠时,Mercurial可以自动进行合并。但是,如果您以两种不同的方式更改同一行,则需要帮助Mercurial合并这两个编辑。
考虑在第一个版本中以hello, world!
开头的文件,然后在第二个版本中更改为sure am glad I'm not using CVS!
:
"hello, world" --- "sure am glad I'm not using CVS!"
您现在更新回第一个修订版并对文本进行不同的更改:
"hello, world" --- "sure am glad I'm not using CVS!"
\
\
\
"sure am glad I'm using Mercurial!"
您现在有发散历史记录,当您hg merge
时,Mercurial会告诉您它已在文件中检测到冲突。 Mercurial将搜索merge tool,如果它在您的系统上找不到任何内容,它将转储文件中的冲突更改。该文件看起来像这样:
<<<<<<< local
sure am glad I'm not using CVS!
=======
sure am glad I'm using Mercurial!
>>>>>>> other
您看到的标记称为合并标记,它们会显示无法自动合并的文件区域。标有local
的顶部区域是您在输入hg merge
之前在工作副本中的版本。标记为other
的底部区域是您合并的分支上的版本。
Mercurial知道该文件尚未解析,您可以使用hg resolve --list
查看。您现在编辑该文件以某种方式组合这两个版本。这是一个组合:
sure am glad I'm using Mercurial and not CVS!
我删除了合并标记并留下了我喜欢的版本。您现在将文件标记为已解析并提交合并:
$ hg resolve --mark hello.c
$ hg commit
我希望有所帮助!
另一条评论:你写了
[...]我试过了:
hg push
。 Mercurial说有“未完成的未提交”的东西。
当您尝试推送时,Mercurial从不谈论未提交的更改。推送和拉动无关到您的工作副本(未提交的更改存在)。因此可以使用脏工作副本进行推拉。你想到的错误可能是
$ hg merge
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg merge
abort: outstanding uncommitted merges
也就是说,在提交或中止当前合并之前,无法启动新的合并。