Version control 使用Mercurial Hg时的替代例程
在使用Mercurial时,我应该使用以下哪种例程,或者哪种更可取,我想听听您的意见。假设我有最新的代码。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
第一个例行程序如下:
hg提交
hg-pull
,hg-update
hg合并
,hg提交
hg推送
hg pull
,hg update
hg提交
,hg推送
我想第一个选项应该是更可取的,因为合并在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。如果你能看看我关于有未限制更改的线性历史记录的文章,那就太好了。这可能会让人震惊,但当你进行更改并保存文件时,你已经创建了一个分支,就你从中提取的回购而言。因此,合并是不可避免的。因此,要善于合并,并做好准备,进行/分段更改,以减少合并冲突的机会。