大多数关于编程的问题,主要取决于你正在与谁一起工作。如果您是一个独立开发者,那么这不应该成为问题,因为您可以按自己的意愿进行操作。但是,如果您在一个团队中工作,需要共享代码,那么您应该与团队成员讨论“行为准则”,因为彼此之间分享更改有时可能会变得棘手。
关于行为准则的讨论不需要很长,可以非常简洁;只要每个人都知道如何使用程序员团队之间共享的存储库即可。如果您想使用Mercurial中的更高级功能(例如挑选或补丁队列),请尝试使用它们,以便不会对团队成员产生负面影响,例如在公共存储库上重新定位。
请记住,版本控制必须易于每个团队成员使用,否则它将无法使用。
何时/多久提交一次?在任何重大更改后,无论是否有效?我完成当天晚上吗?只有在达到下一个稳定迭代时才提交?在任何错误修复后?
在团队中工作时,有几种方法,但常见规则是尽早而又经常提交。你应该经常提交的主要原因是使合并冲突更容易处理。
合并冲突是指当至少两个人对同一行进行编辑时,合并已更改的文件时无法正常工作。如果您拥有一个包含多个文件中数行更改的非常大的更改提交,则接收者很难处理可能发生的冲突。如果保留这些更改过长时间,合并冲突会变得更加困难。
有一些例外规则需要经常提交,其中之一就是在出现重大更改时。虽然如果您有本地提交的能力(Mercurial 和 Git 本质上都支持),您可以提交重大更改,但只要修复了任何问题,应该在修复自己的重大更改后将其推送到共享存储库。
如果我想更改菜单布局,是否需要分支,然后再合并回来?
我应该创建分支吗?
有许多分支策略可供选择(1998 年发布的《流线型》论文提供了详尽的分支策略列表),当您为自己制定策略时,应该开放给自己选择。但是,在团队中工作时,最好与团队进行公开讨论,以确定是否需要创建分支。无论何时您都应该问自己以下问题:
如果以上任何一个问题的答案是肯定的,您应该可能公开分支,或者将其保留给自己(因为在Mercurial中有几种方法可以这样做)。您应该首先与团队讨论如何执行整个尝试,以查看是否有其他方法可以执行它,以及您是否要合并您的更改回来,有时存在一些因素,其中没有必要分支(这主要涉及代码的模块化程度)。
当您决定分支时,请准备好处理合并冲突。可以合理地假设创建分支并进行提交的人能够将其合并回“主分支”。在这些时候,如果团队中的每个人都做出相关的提交注释,那将是很棒的。
顺便说一句:您确实编写了良好的提交注释,对吧?没错吧!一个好的提交注释通常会告诉提交者制作该特定更改的原因或正在开发的功能,而不是一种模糊的“我进行了提交”的注释。这使得处理大型合并冲突的人更容易确定哪些行更改可以被覆盖,哪些行需要保留,同时查看修订历史记录。
编译时间,或者说构建时间,有时会影响到你讨论分支的决策。如果你的项目构建时间很慢,那么在你的分支中使用分阶段策略可能是个好主意。这种策略考虑到所有开发人员都应该集成到“主线”,并且经过批准的更改会被提升(或“晋升”)到下一个阶段,比如测试或发布线。这通常用类似于开源软件的标签名来说明:
main -o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-> ...
\ \ \
test o-----------o--------------o---------> ...
1.0 RC1 \ 1.0 RC2 2.0 RC1
release o----------------------> ...
1.0
这样做的好处是测试人员可以在不被程序员打扰的情况下工作,并且对于那些处于发布管理中的人来说,有一个已知的基线。在分布式版本控制中,不同的线可能是克隆存储库,而且它看起来可能会有所不同,因为存储库共享版本控制图。然而,原则是相同的。
关于Web开发,几乎没有构建时间。但是,通过分阶段分支(或通过标记您的发布修订版本),如果您想检查难以跟踪的错误,则更容易回滚。
然而,另一件事情变得非常重要,那就是部署网站所需的时间。根据我的经验,版本控制工具在资产管理方面真的很差。处理总计多达数GB的艺术资产通常是Subversion(更多是Mercurial)难以处理的大问题。资产可能需要您以较少的时间成本进行处理,例如将它们放在共享空间中,在传统方式下进行同步和备份(艺术资产通常不像源代码文件那样同时进行工作)。
“对于我这个孤独的开发人员来说,分支和合并回来与克隆存储库并将其拉回有什么区别?”分支和保留远程存储库的概念现在比使用集中式版本控制工具更接近。您几乎可以认为它们是相同的东西。在Mercurial(以及git)中,您可以通过以下方式之一“分支”:克隆存储库或创建命名分支。
创建一个命名分支意味着你在所创建的存储库中为版本控制图形创建了一个新路径。创建一个克隆存储库意味着你将源存储库复制到一个新位置,并在克隆存储库的版本控制图形中创建了一个新路径。它们都是版本控制中一般概念下的不同实现。
实际上,你应该关心这两种方法之间唯一的区别在于用法。你可以克隆一个存储库以获得源代码的副本并有一个存储自己更改的地方,而当你想要进行小的实验时,你需要创建命名分支。
由于对于习惯于提交直线的人来说,浏览分支有点棘手,高级用户知道如何操作他们的版本,使版本历史记录与例如
cherry picking或
rebase保持“清洁”。目前,git文档实际上很好地解释了
rebase。