我认为你会发现,在实践中,开发人员更倾向于使用集中式仓库而不是在彼此之间推送和拉取本地仓库。一旦你克隆了中央仓库,在任何跟踪分支上工作时,获取和推送都是微不足道的命令。给所有同事的本地仓库添加半打远程仓库很麻烦,而且这些仓库可能并不总是可用的(关闭,放在家里的笔记本电脑上等)。
在某个时刻,如果你们都在同一个项目上工作,所有的工作都需要集成。这意味着你需要一个集成分支,所有的更改都会汇聚到这个分支上。这自然需要在所有开发人员都可以访问的地方,例如它不应该在主要开发人员的笔记本电脑上。
一旦你设置了一个中央仓库,你就可以使用类似cvs/svn的工作流来检入和更新。cvs update变成了git fetch和rebase(如果你有本地更改),或者只是git pull(如果没有)。cvs commit 变成了git commit和git push。
有了这个设置,你就可以像完全集中式的版本控制系统一样工作。一旦开发人员提交了他们的更改(git push),他们就在中央服务器上,并且会备份。
在两种情况下都需要遵守的规则是防止开发人员将长时间运行的更改留在中央仓库之外。我们中的大多数人可能曾经在这样的情况下工作过,其中一名开发人员正在开发功能“x”,需要在某些核心代码中进行基本更改。这个更改将导致所有其他人都需要完全重建,但是该功能还没有准备好进入主流,因此他只是将其保留在检出状态,直到适当的时间点。
两种情况非常相似,尽管存在一些实际上的差异。使用Git,因为你可以执行本地提交并管理本地历史记录,所以个人开发者可能不像使用cvs那样感到需要推送到中央仓库。
另一方面,使用本地提交的优点是可以作为优势。将所有本地提交推送到中央仓库的安全位置应该不会很困难。本地分支可以存储在开发人员特定的标签命名空间中。
例如,对于Joe Bloggs,可以在他的本地仓库中创建一个别名来响应(例如)
git mybackup
,并执行以下操作。
git push origin +refs/heads/*:refs/jbloggs/*
这是一个单一命令,可在任何时间点(例如一天结束时)使用,以确保所有本地更改得到安全备份。
这对各种灾难都有帮助。Joe的机器坏了,他可以使用另一台机器并获取保存的提交,并从离开的地方继续工作。Joe病了?Fred可以获取Joe的分支,抓取他昨天做的“必须”的修复,但没有机会与主干进行测试。
回到最初的问题。dVCS和集中式VCS之间需要有区别吗?你说在dVCS情况下,半实现的特性和错误修复将不会出现在中央存储库中,但我认为并不需要有区别。
我见过很多情况,在使用集中式VCS时,半实现的特性留在一个开发者的工作电脑上。要么需要制定允许检查半写特性的策略,要么就必须决定创建一个中央分支。
在dVCS中也可能发生同样的事情,但应该做出同样的决策。如果有重要但不完整的工作,它需要被集中保存。Git的优点在于创建这个中央分支几乎是微不足道的。