企业项目开发流程
1. 代码开发工作流
1.1 集中式工作流
所有修改都提交到Master这个分支。比较适合极小团队或单人维护的项目,不建议使用这种方式。
1.2 功能开发工作流
功能开发应该在一个专门的分支,而不是在master分支上。适用于小团队开发。
1.3 GitFlow工作流
公司中最常用于管理大型项目。为功能开发、发布准备和维护设立了独立的分支,让发布迭代过程更流畅。
1.4 Forking工作流
在GitFlow基础上,充分利用了Git的Fork和pull request的功能以达到代码审核的目的。一般用于跨团队协作、网上开源项目。
2. GitFlow工作流各分支说明
2.1 主干分支master
主要负责管理正在运行的生产环境代码,永远保持与正在运行的生产环境完全一致。为了保持稳定性一般不会直接在这个分支上修改代码,都是通过其他分支合并过来的。
2.2 开发分支develop
主要负责管理正在开发过程中的代码。一般情况下应该是最新的代码。
2.3 功能分支feature
为了不影响较短周期的开发工作,一般把中长期开发模块,会从开发分支中独立出来。开发完成后会合并到开发分支。
2.4 准生产分支(预发布分支)release
较大的版本上线前,会从开发分支中分出准生产分支,进行最后阶段的集成测试。该版本上线后,会合并到主干分支。生产环境运行一段阶段较稳定后可以视情况删除。
2.5 bug修理分支hotfix
主要负责管理生产环境下出现的紧急修复的代码。从主干分支分出,修复完毕并测试上线后,并回主干分支和开发分支。并回后,视情况可以删除该分支。
2.6 分支配合工作流程
(1)主分支工作流程
原则上master分支上所有的commit都应该打上Tag,因为一般情况下master是release测试通过后并过来的新版本。
develop分支是基于master分支创建的,与master分支一样都是主分支,不会被删除。
develop从master拉出来之后会独立发展,不会与master直接产生联系。
(2)feature分支工作流程
通常一个独立的特性都会基于develop拉出一个feature分支,feature分支之间没有任何交互,互不影响。feature 分支一旦开发完成后会立马合入develop分支(采用merge request或者pull request),feature分支的生命周期也随之结束。 (3)release分支工作流程
(4)hotfix分支工作流程 hotfix分支基于master分支创建,开发完后需要同时回合到master和develop分支,同时在master上打一个tag。
3. 项目搭建
3.1 创建企业级项目
使用tudou账号登陆,gitlab支持使用模版的方式创建项目,点击新建项目: 选择Create from template选项:
点击使用模版,这里我使用Spring的模版:
在项目生成页面,输入项目名称和描述,点击新建项目:
项目就开始进行自动创建:
稍等片刻项目就生成完毕:
3.2 在线调整代码
可以修改下代码的pom.xml,让模版代码更加适合项目,点击Web IDE按钮: 点击pom.xml, 修改如下:
点击左边提交菜单,点击提交并推送,选择推送到master分支:
3.3 配置项目分支
点击+
号,选择New branch: 创建develop分支:
4. 配置用户密钥
可以使用IDEA的插件Gitlab拉取代码,但是不一定所有的开发用户都使用Gitlab插件,Gitlab支持使用Git本身的SSH进行开发拉取代码,但是SSH使用起来不太方便,每次都需要输入用户密码,这时可以通过配置SSH秘钥的方式进行免密拉取代码。
4.1 生成用户公钥
我们在本地机器上面生成jack的公私钥,首先进入git的命令行窗口,鼠标右键--选择Open Git Bash Here:
mi@JieBaBa-PC MINGW64 ~/Desktop
$ ssh-keygen -t rsa -C gitlab_ssh
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/mi/.ssh/id_rsa):
/c/Users/mi/.ssh/id_rsa already exists.
## 由于我之前已经生成了,可以直接覆盖
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/mi/.ssh/id_rsa
Your public key has been saved in /c/Users/mi/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:MENVU/GSOgf17C7QSDn9USSDlg7mPZ5jGQYaV8wEV6Q gitlab_ssh
The key's randomart image is:
+---[RSA 3072]----+
| ....+BB*=.o|
| . . =*** + |
| + *=*E = |
| +...**+ . |
| S =oo=o |
| +*. |
| .... |
| . |
| |
+----[SHA256]-----+
可以看到命令执行结束,jack的公钥放在c/Users/mi/.ssh/id_rsa.pub文件中。
使用jack登陆,点击用户头像,点击编辑个人资料,进入设置页面,但是选择左边菜单的SSH密钥:
将当前登录用户jack的密钥粘贴到密钥的文本域中,过期时间不填表示永久有效:
点击添加密钥按钮,保存完毕回到密钥页面:
4.2 拉取Gitlab代码
使用jack登陆,点击进入第二个项目springboot-gitlab-demo: 点击克隆按钮,复制git仓库地址:
打开IDEA软件,点击从远程仓库新建:
粘贴git仓库地址,点击clone:
拉取完毕后,在IDEA中:
5. 不同分支代码提交
5.1 领取任务
假设jack账号登录进行完成user模块代码开发任务(提前使用tudou账号创建好议题): 任务可以进行细分,便于任务实现:
在代码开发前需要从develop分支拉取feature分支:
5.2 切换分支并开发
本地代码更新,获取远端分支列表,方便我们切换分支到feature分支上: 假设开发完成:
提交并推送feature分支:
确认push:
5.3 新增合并请求
代码合并到develop分支上,点击创建合并请求快捷方式按钮: 由于领导只有土豆,指派人和审核者都是他:
5.4 处理合并请求
使用tudou的账号登录,点击待办事项: 当前只有一个合并请求,点击第一个合并请求:
在MR(合并请求)中,没有问题的话就点击同意:
可以看到feature分支上的代码自动合并到develop:
6. 冲突提交
当多个人协同开发相同的一个项目时候,就会涉及到提交冲突的问题。
6.1 不同人修改不同文件
- 在远程仓库删除.mvn文件夹:
- 提交并推送修改:
- 选择推送到develop分支:
- 本地IDEA开发,优化user模块:
- 提交代码到远程仓库,就会有报错信息:
- 点击更新,查看git日志可以发现多了一条:
- 再次点击提交并推送:
- 可以看到推送成功:
6.2 不同人修改相同文件不同区域
比如现在tudou临时参与开发代码,修改DemoApplication.java: 修改后,点击提交:
jack现在优化代码,给之前开发的代码添加注释:
jack提交并推送优化后的代码:
发现提交并未成功,原因就是远程版本和本地历史版本不一致:
IDEA推荐使用Merge操作,点击Merge按钮后,代码就自动推送成功了:
6.3 不同人修改相同文件相同区域
比如现在土豆发现程序有bug,调整了代码并提交推送: jack在本地idea中没发现bug,认为已经完成了代码,打算提交并推送:
IDEA推送没成功,弹出对话框,IDEA推荐进行Merge远程代码:
由于是修改相同位置的代码,IDEA和Git工具无法帮助我们自动合并:
点击Merge按钮,展示当前文件冲突的位置内容:
需要进行人工合并,比如先合并tudou的内容,然后调整自己jack的代码:
解决冲突后,点击Apply会自动本地提交,手动点击推送远程:
6.4 不同人修改相同文件的文件名
比如远程tudou修改了文件DemoApplication.java, 改为了DemoWebApplication.java,并做了提交推送: 然后本地jack也做了修改,文件DemoApplication.java, 改为了DemoApplicationPlus.java:
现在jack开始提交并推送代码:
推送过程中提示冲突,此时就不要点击Merge而是Rebase:
冲突的解决办法是使用领导的就行: