与传统的集中式版本控制系统(CVCS)相反,Git 的分布式特性,使开发者间的协作变得更加灵活多样。
在集中式版本控制系统中,每个开发者就像是连接在集线器上的节点,彼此的工作方式大体相像。 而在 Git 中,每个开发者同时扮演着节点和集线器的角色。也就是说, 每个开发者既可以将自己的代码贡献到其他的仓库中,同时也能维护自己的公开仓库, 让其他人可以在其基础上工作并贡献代码。
由此,Git 的分布式协作可以为你的项目和团队,衍生出种种不同的工作流程, 接下来会介绍几种常见Git工作流程。
你可以选择使用其中的某一种,或者将它们的特性混合搭配使用。
Git为了便于客户机之间的协同工作,Git版本控制系统一般会设置一个中央版本库服务器,目的是让所有客户机都从该主机更新版本,提交最新版本,该工作模式下的客户机地位都平等。
集中式工作流像SVN
一样,以中央仓库作为项目所有修改的单点实体,所有修改都提交到 Master分支
上。这种方式与 SVN 的主要区别就是开发人员有本地库,但是Git 很多特性并没有用到。
如下图:
上图说明:
集中式工作流总结:
git clone
远程仓库到本地仓库,在master分支上开发。git pull
更新远程仓库的master分支版本到本地。git commit
到本地仓库, 接着git push
到远程仓库。git push
,一直会提交到本地仓库,没有推送到远程仓库。git pull
,导致本地仓库与中央仓库不一致,发生文件冲突。git pull
,导致增加Git分支合并次数,增加了Git变基次数,降低了Git的性能。功能分支工作流在集中式工作流的基础上,为各个新功能分配一个专门的分支来开发,即在master主分支外在创建一个分支,程序员开发的新功能全部push到此分支上,等到功能成熟的时候,再把此分支合并到主分支master上。
如下图:
分支工作流总结:
git clone
远程仓库到本地仓库。git commit
到本地仓库中自己的feature分支, 接着git push
到远程仓库。pull request
提醒团队组长,浏览组员提交feature分支。git pull
将本地仓库的master分支更新到远程仓库的master分支版本。PS:
Pull Request
作用是可以让其他组员或组长可以查看你的代码,并可以提出代码修改意见或者讨论。
Gitflow工作流没有用超出上面功能分支工作流的概念和命令,而是为不同的分支,分配一个很明确的角色,并定义分支之间如何交互,和什么时候进行交互。
总结就是:Gitflow
工作流通过为功能开发、发布准备和维护设立了独立的分支,让发布迭代过程更流畅,充分的利用了分支的特点。严格的分支模型也为大型项目提供了一些非常必要的结构。
下图是完整的Gitflow
工作流开发方式图,但实际开发工作环境可能会精简:
Gitflow工作流总结:
git clone
远程仓库中的develop分支到本地仓库。(记住,develop分支相当于master的分支,包括功能开发,修改,测试。master分支相当于最终分支)git commit
到本地仓库中自己的feature分支, 接着git push
到远程仓库。pull request
提醒项目维护者,浏览贡献者提交feature分支。git tag
打上版本号。git pull
将本地仓库的master分支更新到远程仓库的develop分支版本。
PS:Gitflow工作流是
Vincent Driessen
工程师提出的多分支工作流。
分叉(Forking)工作流也可以叫做分布式工作流,是在 GitFlow工作流的基础上的衍生,充分利用了Git在分支和克隆上的优势,再加上pull request
的功能,以达到代码审核的目的。既可以管理大团队的开发者(developer)的提交,也可以接受不信任贡献者(contributor)的提交。
这种工作流使得每个开发者都有一个服务端仓库(此仓库只有自己可以push推送,但是所有人都可以pull拉取修改),每个程序员都push代码到自己的服务端仓库,但不能push到正式仓库,只有项目维护者才能push到正式仓库,这样项目维护者可以接受任何开发者的提交,但无需给他正式代码库的写权限。
这种工作流适合开源社区的开源项目,大家统一对项目做贡献,但是有一个人或一个团队作为开发者来管理项目,所有的贡献者的代码由开发者审核,其功能完善之后再由开发者push到正式仓库中。
总结:
提示:
- 每个成员都可以从中央版本库中拉取代码。
- 每级成员都只能向上一级提交代码。
- 上一级合并代码之后继续向上级提交代码。
- 最后只有独裁者才能向中央版本库提交代码。
分叉工作流(分布式仓库工作流)总结:
git clone
主项目维护者的远程仓库的副本到本地仓库。git commit
到本地仓库中自己的feature分支, 接着git push
到远程仓库。pull request
命令,从项目维护者合并自己feature分支,到从项目维护者的远程仓库的master分支上。pull request
向主项目维护者的远程仓库的推送。pull request
获取从项目维护者的远程仓库的推送。上面介绍了在Git分布式系统中经常使用的工作流程,但是在实际的开发中,你会遇到许多可能适合你的特定工作流程的变种,你可以按照实际的情况,灵活的进行组合和拓展。
参考:
- https://blog.csdn.net/shengzhu1/article/details/77990582
- https://blog.csdn.net/weixin_43691058/article/details/106427915
- https://blog.csdn.net/weixin_30344795/article/details/96683694
- https://git-scm.com/book/zh/v2/