2

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

1 回答 1

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 将搜索合并工具,如果在您的系统上找不到任何合并工具,它将转储文件中的冲突更改。然后该文件如下所示:

<<<<<<< local
sure am glad I'm not using CVS!
=======
sure am glad I'm using Mercurial!
>>>>>>> other

您看到的标记称为合并标记,它们向您显示无法自动合并的文件区域。上面标有 的区域local是您在输入之前在工作副本中拥有的版本hg merge。标记的底部区域other是您合并的分支上的版本。

Mercurial 知道该文件未解析,您可以使用 with 来查看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

也就是说,您不能在提交或中止当前合并之前开始新的合并。

于 2013-11-12T08:47:08.143 回答