如何与mercurial合并

时间:2013-11-11 23:53:25

标签: macos mercurial merge bitbucket

我创建了一个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

1 个答案:

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

也就是说,在提交或中止当前合并之前,无法启动新的合并。