Mercurial update-pull vs commit

时间:2014-08-20 15:04:10

标签: mercurial dvcs

我很难理解mercurial下的场景。

假设我有2个用户在同一个存储库上工作。假设repo被称为'Test'并且它当前有文件:a.txt& b.txt(两个文本文件当前都是空的,其中没有文字)

这就是发生的事情:

用户1:

使用句子“Line 1”修改a.txt 将代码提交到本地仓库(未发出推送命令)

用户2:

使用句子“Line 1”修改b.txt 将代码提交给本地仓库 同时发出推送命令

用户1:

发出拉取命令 发出更新命令

结果:在用户1的工作目录中,文件a.txt不再包含句子“第1行”,文件b.txt包含用户2的更改.a.txt的初始更改在哪里?覆盖?我可以在历史记录中看到它们(使用TortoiseHG),但这些变化不再适用了。

这到底发生了什么?我的理解如下:当用户1发出拉动时,他本地仓库的更改应该以某种方式合并来自用户2的更改与用户1已经提交的内容。

你能告诉我我的假设/理解在哪里错了吗?如果上述问题的解决方案是关于正确的提交/推送/更新/拉动顺序,那么对于同一代码上的多个开发人员的环境,建议的操作序列是什么?

1 个答案:

答案 0 :(得分:2)

User1 拉出时, User2 的变更集会放在回购的顶端。当他发出hg update命令时,Mercurial会更新当前分支的最新提示,即 User2 的变更集,而不会进行 User1 的修改。

User1 现在在他的回购中有两个头,他自己的变更集和 User2 的变更集。为了获得两个变更集的组合,他必须通过发出hg merge命令来合并两个头,这将合并当前分支的两个头。不要忘记提交合并的变更集。

合并操作不会自动完成,Mercurial不会为您做出决定。在推送变更集之前,您可能希望使用变更集执行其他操作。

例如,这个合并操作的一个更漂亮的替代方法是使用Rebase扩展,按顺序放置两个更改集,并发出此命令

hg rebase -s <User1-revision> -d <User2-revision>
hg update

您基本上是在对 User1 进em>在技巧上重新定位。如果 User1 的变更集尚未推向公众,则此替代方案效果很好。