Version control 使用Mercurial Hg时的替代例程

Version control 使用Mercurial Hg时的替代例程,version-control,mercurial,workflow,dvcs,Version Control,Mercurial,Workflow,Dvcs,在使用Mercurial时,我应该使用以下哪种例程,或者哪种更可取,我想听听您的意见。假设我有最新的代码。 第一个例行程序如下: 做我的工作 hg提交 如果需要,重复步骤1和2 当我准备好推送时,我将推送hg-pull,hg-update hg合并,hg提交 hg推送 二是: 做我的工作 当我准备好提交时,我hg pull,hg update hg提交,hg推送 问题是,据我所知,第一种方案是大多数开发人员(应该)使用的方案,因为与第二种使用方案不同,它提供了使用本地存储库的机会,因为这对于DV

在使用Mercurial时,我应该使用以下哪种例程,或者哪种更可取,我想听听您的意见。假设我有最新的代码。
第一个例行程序如下:

  • 做我的工作
  • hg提交
  • 如果需要,重复步骤1和2
  • 当我准备好推送时,我将推送
    hg-pull
    hg-update
  • hg合并
    hg提交
  • hg推送
  • 二是:

  • 做我的工作
  • 当我准备好提交时,我
    hg pull
    hg update
  • hg提交
    hg推送
  • 问题是,据我所知,第一种方案是大多数开发人员(应该)使用的方案,因为与第二种使用方案不同,它提供了使用本地存储库的机会,因为这对于DVC来说是正常的

    我的同事鼓励我使用第二种方法,因为这样我避免了分支和以后可能出现的合并问题(因为在过去,不知何故,他们有这样的问题),所以我留在主干开发线上。
    我想第一个选项应该是更可取的,因为合并在DVCS中是不应该害怕的,不像在CVCS中,它给了我使用本地存储库的机会。

    基本上,您自己已经回答了这个问题:

    第一个例程是DVCS的“默认”例程,因为它利用了典型的DVCS功能
    (本地存储库,更快的提交,因为不涉及网络,更详细的历史记录,因为有很多小提交而很少有大提交…)

    使用第二个例程不是“错误”或“不好”,但您必须意识到,您使用DVCS就像使用CVCS一样,因此您故意选择不使用DVCS的一些优点(见上文)

    长期使用CVCS的人(可能像你的同事一样)通常更喜欢第二套,因为这会让他们感觉到更多他们已经知道的东西。

    此外,合并在DVCS中比在CVCS中效果更好,因此他们的“合并可能存在的问题”论点可能只是因为他们过去在CVCS中遇到了问题,并假设在DVCS中情况相同(事实并非如此)。

    在这两种情况下,您将做的工作没有任何区别:

    • 对于第一个工作流,您将在步骤5中进行合并

    • 对于第二个工作流,执行与步骤2中更新的一部分完全相同的合并

    第一个工作流对许多人来说更安全,因为您正在处理已经提交的工作。这意味着,如果合并结果很复杂,那么返回到干净状态是很简单的:
    hg update-C.

    但是,即使使用第二个工作流,您也可以恢复原始文件:
    hg resolve--all--tool internal:local
    将重做
    hg update
    启动的合并,并为所有文件选择原始版本

    真正的区别在于第一个工作流更好地显示了实际发生的情况。使用该工作流,您可以以更小、更符合逻辑的步骤显示更改。当你的大学试图了解你做了什么(代码审查)以及未来的调试(使用
    hg-bisect
    )时,这会有很大帮助

    使用
    hg-rebase
    ,您可以在这两个世界中获得最佳效果。这让你可以做出小的、合乎逻辑的承诺,然后最终将这些承诺转移到你的大学所做的工作之上。在这种情况下,不会有合并变更集——良好且丰富的线性历史

    因此,如果您在拉动后有此历史记录:

    ... [a] --- [b] --- [x] --- [y] --- [z]
                   \
                    [d] --- [e]
    
    如果您已将
    x
    创建为
    z
    ,则正常合并将创建此历史记录:

    ... [a] --- [b] --- [x] --- [y] --- [z]
                   \                       \
                    [d] --- [e] ----------- [f]
    
    带着你得到的回扣

    ... [a] --- [b] --- [d] --- [e] --- [x'] --- [y'] --- [z']
    
    其中
    x'
    z'
    x
    z
    的重基版本(不同的变更集ID,因为它们有不同的祖先)


    我一直这样使用rebase,我觉得它提供了最好的整体历史。请记住不要对已公开的变更集重新设置基址:重新设置基址会修改变更集,但如果变更集已公开,则很难修改其他副本。结果是重复的变更集和混乱。

    将变更集公开是什么意思?推送到中央存储库?是的,当其他人看到变更集并且可能基于它进行工作时,变更集是“公共的”。推送到中央存储库是人们公开变更集的正常方式。thx@MartinGeisler。如果你能看看我关于有未限制更改的线性历史记录的文章,那就太好了。这可能会让人震惊,但当你进行更改并保存文件时,你已经创建了一个分支,就你从中提取的回购而言。因此,合并是不可避免的。因此,要善于合并,并做好准备,进行/分段更改,以减少合并冲突的机会。