我认为您会发现在实践中开发人员更喜欢使用中央存储库,而不是在彼此的本地存储库之间推拉。克隆中央存储库后,在处理任何跟踪分支时,获取和推送都是微不足道的命令。将六个遥控器添加到所有同事的本地存储库是一件痛苦的事情,而且这些存储库可能并不总是可以访问(关闭、在带回家的笔记本电脑上等)。
在某些时候,如果你们都在做同一个项目,那么所有的工作都需要整合起来。这意味着您需要一个集成分支,将所有更改汇集在一起。这自然需要所有开发人员都可以访问,例如,它不属于首席开发人员的笔记本电脑。
设置中央存储库后,您可以使用 cvs/svn 样式的工作流程来签入和更新。如果您有本地更改,则 cvs update 变为 git fetch 和 rebase,如果没有,则变为 git pull。cvs commit 变成 git commit 和 git push。
通过此设置,您的完全集中式 VCS 系统处于类似的位置。一旦开发人员提交了他们的更改(git push),他们需要这样做才能对团队的其他成员可见,他们就在中央服务器上并将被备份。
在这两种情况下需要纪律的是防止开发人员将长期运行的更改保留在中央存储库之外。我们中的大多数人可能都曾在这样一种情况下工作过,其中一名开发人员正在开发功能“x”,这需要对某些核心代码进行根本性的改变。这一变化将导致其他所有人都需要完全重建,但该功能还没有为主流做好准备,所以他只是保持检查直到一个合适的时间点。
尽管存在一些实际差异,但两种情况的情况都非常相似。使用 git,因为您可以执行本地提交并可以管理本地历史记录,所以个人开发人员可能不会像使用 cvs 之类的东西那样感觉到需要推送到中央存储库。
另一方面,使用本地提交可以作为一个优势。将所有本地提交推送到中央存储库上的安全位置应该不是很困难。本地分支可以存储在开发人员特定的标签命名空间中。
例如,对于 Joe Bloggs,可以在他的本地存储库中创建一个别名来执行类似以下的操作以响应 (eg) git mybackup
。
git push origin +refs/heads/*:refs/jbloggs/*
这是一个可以在任何时候(例如一天结束)使用的单个命令,以确保他的所有本地更改都得到安全备份。
这有助于应对各种灾难。Joe 的机器坏了,他可以使用另一台机器并获取已保存的提交并从他离开的地方继续。乔病了?Fred 可以取出 Joe 的分支来获取他昨天所做的“必须”修复,但没有机会与 master 进行测试。
回到原来的问题。dVCS 和集中式 VCS 之间是否需要有所区别?您说在 dVCS 案例中,半实现的功能和错误修复不会出现在中央存储库中,但我认为没有区别。
在使用集中式 VCS 时,我已经看到许多情况下,一个半实现的功能仍停留在一个开发人员的工作台上。它要么采用允许将一半编写的功能签入主流的策略,要么必须做出创建中央分支的决定。
在 dVCS 中可能会发生同样的事情,但应该做出同样的决定。如果有重要但不完整的工作,需要集中保存。git 的优点是创建这个中央分支几乎是微不足道的。