【问题标题】:Mercurial update-pull vs commitMercurial 更新拉取与提交
【发布时间】:2014-08-20 15:04:10
【问题描述】:

我很难理解 mercurial 下的场景。

假设我有 2 个用户在同一个存储库上工作。假设 repo 被称为“测试”并且它当前有文件: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 已经提交的更改合并。

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

【问题讨论】:

    标签: mercurial dvcs


    【解决方案1】:

    User1 拉取时,User2 的变更集被放在 repo 的顶端。当他发出hg update 命令时,Mercurial 会更新到当前分支的最新提示,即 User2 的变更集,而无需 User1 的修改。 p>

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

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

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

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

    您基本上是在对变更集进行重新排序,就好像 User1 的修改是在 User2 的修改之后进行的,这些修改已经公开并且是 repo 的一部分,由 rebase 他们在小费。如果 User1 的变更集尚未公开发布,则此替代方案效果很好。

    【讨论】:

    • 谢谢。我想这是有道理的。我正在使用 TortoiseHG,并没有“明确”的迹象表明我在用 2 个头运行。我必须发出 hg head comman 才能直观地看到它。我很确定 TortoiseHG 会告诉我关于 2 个头的事,但我似乎不知道在哪里......
    • 拥有多个头部并不罕见,因此没有警告,但您可以在 TortoiseHg 的图表中看到分裂。但是,在推送时,您会收到警告,Mercurial 将阻止操作,直到您解决多头问题。
    • 感谢文斯提供的宝贵意见。仅供参考,我合并了两个头,我能够正常继续我的工作。感谢帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多