git 功能工作流
gitflow 工作流
前言
Gitflow 工作流通过功能开发、发布准备和维护设立了独立的分支,让发布迭代过程更加流畅。
1.分支设计
-
master 主干分支
主分支,为 protect 分支,只允许其他分支 merge ,不允许直接 push 代码。对项目进行 tag 或发布版本等操作。主要 负责管理正在运行的生产环境,永远保持与正在运行的生产环境一致
-
develop 开发分支
从 master 分支检出,但是团队成员一般不会直接更改该分支,而是从该分支检出自己的 feature fenzhi ,开发完成后,将 feature 和 bug 分支提交到 merge request 到 develop 分支,同时 release 分支由此分支检出。主要负责管理正在开发过程中的代码,一般是最新的代码
-
feature分支 功能分支
从 develop 分支检出,团队成员每个人都维护一个自己的 feature 分支(针对每个功能开一个 feature 分支进行开发),可以命名为 [feature_xxx] ,开发完成以后提交 merge request ,合并到 develop 分支。一般用来开发新功能或进行项目维护,同时为不影响开发工作,一般把中长期的开发模块,从开发分支中独立出来,开发完成后合并到开发分支
-
hotfix bug 修理分支
从 master 分支检出,开发遇到 bug ,新开一个 bug 分支,修复后,也提交 merge request 到 develop。主要负责管理生产环境下出现的紧急 修复的代码,从主干分出,修理完毕并测试上线后,并回主干分支。并回后,视情况删除,属于临时性分支
-
fix分支 补丁分支
从 develop 分支检出,用作 bug 修复,bug 修复后需要 merge 回 develop 分支,并将其删除,属于临时性分支
-
release 准生产分支(预发布分支)
较大版本上线前,会从开发分支中分出准生产分支,进行最后阶段的集成测试。该版本上线后,会合并到主干分支。生产环境运行一段时间稳定后,可以视情况删除
2.工作流
1.奶糖在 master 分支上完成 V0.1 版本的开发
2. master 分支出现 bug ,进行紧急修复。新建并检出 hotfix 分支修复,merge 回 master 分支,发布版本v0.2
3. 奶糖新建并检出 develop 分支进行迭代开发。在 develop 分支上检出 release01 分支,进行发版前的测试和 bug 。后 fix bugs in release01。完成后将release01分支 merge 回 develop 和 master 分支,并发布版本v0.3
4. 添加队员,新队员在 develop 上新建并检出自己的 feature 分支,开发后 merge 回 develop 分支。此处要利用 rebase 操作和冲突解决。
5. 奶糖在develop 上检出release02分支,再次进行发版前测试和 bug 修复, fix bugs in release01。 完成后将release01分支 merge 回 develop 和 master 分支,并发布版本v1
分析拆解各种类型分支的用法
-
奶糖在做一个叫做 testing 的项目,并托管到了 Github 上。
(根据 Github 上的提示,在本地新建一个项目,并关联到 github 上的 origin/master.此时开发一个很小的demo功能,并在 master 分支上进行 tag 操作,命名为 v01.)
-
此时 master 分支的代码在线上运行,同时又要快开发新功能。
在 master 分支上新建并检出 develop 分支,在develop 分支上开发新功能,结束需要提交到远端。
1. git brabch develop master // 从master分支上新建develop分支 2. git checkout develop //检出 develop 分支 3. ... //此处进行功能开发,并 add 和 commit 到 develop 分支 4.git push origin develop //推送 develop 分支到远端的 origin/develop
此时远端 github 上有两个分支:master 和 develop。
此时会出现两种情况,如下所示-
修改 bug
线上版本(master 分支)出现紧急 bug ,需要修复。需要用到 hotfix.
-
1. git checkout master //切回 master 分支
2. git checkout -b hotfix master //新建、并切换到 hotfix 分支
3. ... // bug 修复工作
4. git checkout master //切换回 master 分支
5. git merge --no-ff hotfix //合并 hotfix 分支到 master 分支,此时 bug 已经修复,无冲突
6. git tag v0.2 //新建 tag v0.2
7. git push origin --tags //推送 tag 到远端的 origin/tag
图解过程:
-
develop 开发完成,进行测试和提交。需要用到 release
1. git checkout develop //切换回 develop 分支 2. git checkout -b release01 develop //新建、切换到release01 3. ... //进行测试、bug修复等工作 4. git checkout develop //切回 develop 分支 5. git merge --no-ff release01 //合并release01 分支到develop分支(无冲突) 6. push origin develop //推送develop分支到远端 origin/develop(无冲突) 7. git checkout master //切换到 master 分支 8. git merge --no-ff release //合并 release01 到 master 分支(无冲突) 9. git tag v0.3 //新建 tag v0.3 10. push origin master ///推送 master 分支代码到远端的 origin/master 11.git push origin --tags //推送 tag 到远端的 origin/tag
详细图解:
-
加入新队员,开发不同功能,用到 feature 功能
- 每个人应该做的
git clone xxxx.git git checkout develop git checkout -b feature-xx develop
- 奶糖进行操作进行首次提交到了 github 远端
1. git checkout -b feature-hu develop 2. ... //进行功能开发,不断add 和 commit 3. git checkout develop 4. git pull origin develop //更新到远端代码,看develop分支是 否更新(无更新) 5. git checkout feature-hu //切回featurep分支 6. rebase develop //合并develop分支到feature分支,并解决冲突(无冲突) 7. git checkout develop //切回develop分支 8. git merge --no-ff feature-hu //合并feature到develop分支 9. git push origin develop //推送develop分支到远端
图解详情
3. 其他人在奶糖之后进行 push 操作1. git checkout-b feature-z develop //从develop分支新建并检出feature分支 2. ... // 进行功能开发,不断进行add 和commit 3. git checkout develop 4. git pull origin develop //更新远端代码,看develop是否有更新 5. git checkout feature-z 6. git rebase develop //合并develop到feature分支,解决冲突(有冲突) 7. ... //冲突解决 8. git add . //解决完冲突后执行 add 操作 9. git rebase --continue //继续刚才的 rebase 操作 10.git checkout develop //切回 develop 分支 11.git merge --no-ff feature-z //合并feature分支到develop分支(无冲突) 12.git push origin develop //推送develop分支到远端
- 团队 其他人进行开发,检出自己的 feature 分支就可以了
注意:
奶糖进行pull操作,既可以看到 z 进行的操作。
-
再次进行测试、发版操作,需要再次新建并检出 release 分支,重复2的步骤
##3.几个命令的区别
- git merge 和 get rebase
git merge | git rebase |
---|---|
1.显性合并 2.合并分支,解决完冲突,执行add 和commit操作,会产生一个额外的commit |
1.隐形合并 2.合并分支,解决完冲突,执行add 和git rebase --continue 不会产生额外 的commit(主分支上无意义的) |
- git pull
-
git pull
执行 git pull时,是同时执行了 git fetch 和 git merge 两个操作
-
git pull -rebase
不进行 merge 操作 ,即不想留下合并记录,可以用这个命令,不会产生无用的commit(主分支上无意义的) |
- git pull
-
git pull
执行 git pull时,是同时执行了 git fetch 和 git merge 两个操作
-
git pull -rebase
不进行 merge 操作 ,即不想留下合并记录,可以用这个命令
上一篇: 【转】推荐大家使用的CSS书写规范、顺序
下一篇: MySQL添加数据文件