Skip to content

企业项目开发流程

1. 代码开发工作流

1.1 集中式工作流

所有修改都提交到Master这个分支。比较适合极小团队或单人维护的项目,不建议使用这种方式。
Alt text

1.2 功能开发工作流

功能开发应该在一个专门的分支,而不是在master分支上。适用于小团队开发。
Alt text

1.3 GitFlow工作流

公司中最常用于管理大型项目。为功能开发、发布准备和维护设立了独立的分支,让发布迭代过程更流畅。
Alt text

1.4 Forking工作流

在GitFlow基础上,充分利用了Git的Fork和pull request的功能以达到代码审核的目的。一般用于跨团队协作、网上开源项目。
Alt text

2. GitFlow工作流各分支说明

Alt text

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直接产生联系。
Alt text
(2)feature分支工作流程
通常一个独立的特性都会基于develop拉出一个feature分支,feature分支之间没有任何交互,互不影响。feature 分支一旦开发完成后会立马合入develop分支(采用merge request或者pull request),feature分支的生命周期也随之结束。
Alt text (3)release分支工作流程
Alt text (4)hotfix分支工作流程 hotfix分支基于master分支创建,开发完后需要同时回合到master和develop分支,同时在master上打一个tag。 Alt text

3. 项目搭建

3.1 创建企业级项目

使用tudou账号登陆,gitlab支持使用模版的方式创建项目,点击新建项目:
Alt text 选择Create from template选项:
Alt text 点击使用模版,这里我使用Spring的模版:
Alt text 在项目生成页面,输入项目名称和描述,点击新建项目:
Alt text 项目就开始进行自动创建:
Alt text 稍等片刻项目就生成完毕:
Alt text

3.2 在线调整代码

可以修改下代码的pom.xml,让模版代码更加适合项目,点击Web IDE按钮:
Alt text 点击pom.xml, 修改如下:
Alt text 点击左边提交菜单,点击提交并推送,选择推送到master分支:
Alt text

3.3 配置项目分支

点击+号,选择New branch:
Alt text 创建develop分支:
Alt text

4. 配置用户密钥

可以使用IDEA的插件Gitlab拉取代码,但是不一定所有的开发用户都使用Gitlab插件,Gitlab支持使用Git本身的SSH进行开发拉取代码,但是SSH使用起来不太方便,每次都需要输入用户密码,这时可以通过配置SSH秘钥的方式进行免密拉取代码。

4.1 生成用户公钥

我们在本地机器上面生成jack的公私钥,首先进入git的命令行窗口,鼠标右键--选择Open Git Bash Here:
Alt text

sh
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密钥:
Alt text
将当前登录用户jack的密钥粘贴到密钥的文本域中,过期时间不填表示永久有效:
Alt text
点击添加密钥按钮,保存完毕回到密钥页面:
Alt text

4.2 拉取Gitlab代码

使用jack登陆,点击进入第二个项目springboot-gitlab-demo:
Alt text 点击克隆按钮,复制git仓库地址:
Alt text 打开IDEA软件,点击从远程仓库新建:
Alt text 粘贴git仓库地址,点击clone:
Alt text 拉取完毕后,在IDEA中:
Alt text

5. 不同分支代码提交

5.1 领取任务

假设jack账号登录进行完成user模块代码开发任务(提前使用tudou账号创建好议题):
Alt text 任务可以进行细分,便于任务实现:
Alt text 在代码开发前需要从develop分支拉取feature分支:
Alt text

5.2 切换分支并开发

本地代码更新,获取远端分支列表,方便我们切换分支到feature分支上:
Alt text 假设开发完成:
Alt text 提交并推送feature分支:
Alt text 确认push:
Alt text

5.3 新增合并请求

代码合并到develop分支上,点击创建合并请求快捷方式按钮:
Alt text 由于领导只有土豆,指派人和审核者都是他:
Alt text

5.4 处理合并请求

使用tudou的账号登录,点击待办事项:
Alt text 当前只有一个合并请求,点击第一个合并请求:
Alt text 在MR(合并请求)中,没有问题的话就点击同意:
Alt text 可以看到feature分支上的代码自动合并到develop:
Alt text

6. 冲突提交

当多个人协同开发相同的一个项目时候,就会涉及到提交冲突的问题。

6.1 不同人修改不同文件

  1. 在远程仓库删除.mvn文件夹:
    Alt text
  2. 提交并推送修改:
    Alt text
  3. 选择推送到develop分支:
    Alt text
  4. 本地IDEA开发,优化user模块:
    Alt text
  5. 提交代码到远程仓库,就会有报错信息:
    Alt text
  6. 点击更新,查看git日志可以发现多了一条:
    Alt text
  7. 再次点击提交并推送:
    Alt text
  8. 可以看到推送成功:
    Alt text

6.2 不同人修改相同文件不同区域

比如现在tudou临时参与开发代码,修改DemoApplication.java:
Alt text 修改后,点击提交:
Alt text jack现在优化代码,给之前开发的代码添加注释:
Alt text jack提交并推送优化后的代码:
Alt text 发现提交并未成功,原因就是远程版本和本地历史版本不一致:
Alt text IDEA推荐使用Merge操作,点击Merge按钮后,代码就自动推送成功了:
Alt text

6.3 不同人修改相同文件相同区域

比如现在土豆发现程序有bug,调整了代码并提交推送:
Alt text jack在本地idea中没发现bug,认为已经完成了代码,打算提交并推送:
Alt text IDEA推送没成功,弹出对话框,IDEA推荐进行Merge远程代码: Alt text 由于是修改相同位置的代码,IDEA和Git工具无法帮助我们自动合并: Alt text 点击Merge按钮,展示当前文件冲突的位置内容:
Alt text 需要进行人工合并,比如先合并tudou的内容,然后调整自己jack的代码:
Alt text 解决冲突后,点击Apply会自动本地提交,手动点击推送远程:
Alt text

6.4 不同人修改相同文件的文件名

比如远程tudou修改了文件DemoApplication.java, 改为了DemoWebApplication.java,并做了提交推送:
Alt text 然后本地jack也做了修改,文件DemoApplication.java, 改为了DemoApplicationPlus.java:
Alt text 现在jack开始提交并推送代码:
Alt text 推送过程中提示冲突,此时就不要点击Merge而是Rebase:
Alt text 冲突的解决办法是使用领导的就行:
Alt text