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