【GitFlow】团队开发协作

1 GitFlow概述

GitFlow是一种流行的Git分支管理策略,主要用于软件开发过程中的版本控制和协作。它通过定义清晰的分支结构和工作流程,帮助开发团队更高效地管理代码的开发、测试和发布

GitFlow团队协作对应开发流程/提交规范

常见常用高阶Git命令是否清楚

2 Git常用命令

2.1 Git三个区间

3 GitFlow理论

3.1 GitFlow是什么

GitFlow是一种非常经典的分支管理和发布模型

它特别适合管理有固定发布周期、需要并行开发多个功能以及需要长期维护多个版本的项目。

3.2 GitFlow能干嘛

核心思想:

GitFlow的核心是利用严格的分支模型,为不同的开发任务分配独立的分支,使得开发过程更加结构化、井井有条。

它定义了主要分支和辅助分支并规定了它们之间的交互方式。它是一个非常强大和系统的流程,特别适合有固定发布计划、版本维护需求明确的中大型项目,在选择提交工作流时,应根据团队规模和项目特点来决定是否采用。

3.3 主要分支

3.3.1 五大分支总体概述

① 主分支(master/main)

② 开发分支(develop)

③ 功能分支(feature/*)

feature有道翻译:特点,特征。

④ 发布分支(release/*)

⑤ 热修复分支(hotfix/*)

3.3.2 细说五大分支

3.3.2.1 包含两个贯穿整个项目生命周期的主要分支:

① 主分支(master/main)

② 开发分支(develop)

3.3.2.2 辅助/临时分支

以下3个分支是为了完成特定任务而创建的,任务完成后会被合并并删除

③ 功能分支(feature/*)

feature有道翻译:特点,特征。

④ 发布分支(release/*)

⑤ 热修复分支(hotfix/*)

4 GitFlow实操

4.1 GitFlow操作流程(标准版)

4.2 GitFlow开发流程和提交规范(实战版)

4.2.1 实战案例,步骤详解

4.2.2 gitee远程仓库初始化

1 必定有一个master分支(公司主管已经弄好,现成的)

2 以master分支为起点的dev开发分支

3 入职公司gitee上待下载到本地的工作项目

4.2.3 新员工入职开工

4.2.3.1 检出项目到新员工本地IDEA开发环境

在自己本地IDEA专属开发目录下执行(工具版本)

启动IDEA工具打开上一步clone下来的项目并进入命令终端模式,再用 git pull

① 进入终端命令窗口再用git pull检查下

② 看看分支情况

在自己本地IDEA专属开发目录下执行(命令行版本)

操作也差不多,使用右键 Git Bash Here

4.2.3.2 开发新需求,日常操作
4.2.3.2.1 理论-新开发
4.2.3.2.2 gitee上新建开发某个需求的featureA分支以dev作为分支起点

产品经理建 或 开发人员建 都OK

产品经理建立分支:自顶向下。在远程库建好分支后,开发人员本地拉取

开发人员建立分支:自底向上。在本地建好分支后,推送到远程库

4.2.3.2.3 分支具体细节名称和规范
4.2.3.2.4 feature新需求分支建立完毕
4.2.3.2.5 打开idea用git pull同步下
4.2.3.2.6 将featureA分支从remote检出到local
4.2.3.2.7 在本地featureA上开发编码

add

commit -m

push

4.2.3.2.8 gitee上查看本地feature提交到远程feature情况
4.2.3.2.9 featureA上开发完成的需求要合并进dev分支上

理论-开发完后合并

将dev分支检出到本地

将你在本地feature上完成的功能合并到本地dev分支

本地dev分支push到远程dev分支

4.2.3.2.10 全部开发完成后可以考虑删除featureA分支(可选非必要)

删除本地

git branch -d featureA/featureA_20251212_xxx需求

删除远程

git push origin --delete featureA/featureA_20251212_xxx需求

4.2.3.3 需求开发后,需要发布一个版本(Release)

理论-发布前

Gitee上新建发布分支release-0.1.0以dev作为分支起点

打开idea用git pull同步下

将release-0.1.0分支从remote检出到local

一般而言,发布新版本或多或少会在release分支上改改

配置/IP/密码/小bug/页面等小改动,作为发布准备工作:

add

commit

push

理论-发布中

release-0.1.0分支内容合并进master分支

git checkout master

git merge --no-ff release-0.1.0

git push origin master

打个tag(master上需要打tag)

git tag -a v0.1.0 master

git push --tags

远程仓库标签情况

创建发行版

理论-发布后

release-0.1.0分支内容合并进dev分支

git checkout dev

git merge --no-ff release-0.1.0

git push origin dev

全部发布完成后可以考虑删除release分支

删除本地

删除远程

4.2.3.4 需求发开中,生产报Bug需要处理

理论-生产bug

从master分支作为起点,创建hotfix分支

git checkout -b hotfix-0.1.0 master

修bug

add

commit

git push origin hotfix-0.1.0

远程仓库看看

bug修复完成后需要将hotfix分支合并进master分支

git checkout master

git merge --no-ff hotfix-0.1.0

git push origin master

tag打个自增标签作为修复bug版

git tag -a v0.1.0fix master

git push --tags

远程仓库标签情况

最后,需要将hotfix分支合并进dev分支

git checkout dev

git merge --no-ff hotfix-0.1.0

git push origin dev

全部发布完成后可以考虑删除hotfix-0.1.0分支

删除本地 git branch -d hotfix-0.1.0

删除远程 git push origin --delete hotfix-0.1.0

5 GitFlow小总结

5.1 常用流程一般性总结

5.1.1 feature_新功能开发流程

5.1.2 release_版本发布流程

5.1.3 hotfix_紧急热修复流程

5.2 优点

结构清晰:每个分支职责明确,易于理解和管理

并行开发:支持多个功能并行开发,互不干扰

发布管理:release分支使发布过程变得清晰、可控

紧急响应:hotfix分支提供了快速修复生产问题的通道,不影响正常开发流程

5.3 缺点

流程复杂:对于小型团队或简单项目来说过于繁重

历史不清晰:由于大量的合并提交,Git提交历史会显得比较混乱。

学习成本:新团队成员需要时间熟悉整个流程

5.4 礼貌提醒

不是大厂/中厂就别用

总而言之,GitFlow是一个非常强大的代码分支管理体系,特别适合有固定发布计划、版本并行开发且维护需求明确的中大型项目。在选择工作流时,应根据团队规模和项目特点来决定。

6 Git高阶命令

Git三个区间

通用操作

6.1 版本回退/撤销/重置(CheckOut - Revert - Reset)

6.1.1 情况1:有改动,无add无commit无push

通俗点讲,就是某个被git追踪的文件修改了变成蓝色了,但是没有add,没有commit,没有push。通过 命令 git checkout -- 文件名 ,或者点击Rollback进行回退,变回黑色文件

6.1.2 情况2:有改动有add,无commit无push

git reset的三种模式:

git reset --soft <commit>

git reset --mixed <commit>(默认模式)

git reset --hard <commit>

小总结

也可以直接使用IDEA图形界面的Rollback

6.1.3 情况3:有改动有add有commit,无push

6.1.4 情况4:有改动有add有commit有push★

本次push作废,重新来

6.1.4.1 图形
6.1.4.2 命令

git revert --no-edit 提交流水号

6.1.4.3 再反转

6.1.5 小总结

6.1.5.1 Revert VS Reset

记住这个黄金法则:对私有分支用reset,对公共历史用revert

6.1.5.2 判断是否在历史记录留痕★★★★★

工作区:本地磁盘中存放代码的具体的目录

暂存区:在工作区中写了代码后,需要让git追踪到,让git知道你有这么个代码文件。因此需要使用git add 将工作区的代码添加到暂存区

本地库:

工作区和暂存区的代码,都可以无痕删除。一旦commit提交本地库后,本次提交就生成了历史版本,留痕了。

一旦提交commit,就生成了提交对象,成为项目历史的一部分。这是绝对无法"无痕删除"的。

6.2 git stash之临时存储柜★

1 存储柜是"栈"结构(先进后出):

可以多次使用git stash,每次都会讲修改推入栈顶

使用git stash list可以查看存储柜里所有的"包裹"

使用git stash pop stash@{n}可以取出指定的包裹(n是编号)

2 取出的两种方式:

git stash pop:取出栈顶的包裹,同时从存储柜中删除它。(就像从柜子里拿出东西后扔掉包装)

git stash apply:取出栈顶的包裹,但包裹仍留在存储柜中。(就像复制了一份)

3 存储的内容:

默认值存储已跟踪文件的修改(即之前被git add过的文件的新修改)

如果要包含未跟踪的文件(新创建的文件),需要用git stash -u

如果要包含被忽略的文件,用git stash -a

6.2.1 git stash

一句话:把当前工作现场"储藏"起来,等以后恢复现场后继续工作

6.2.2 需求说明

6.2.3 案例步骤v2

1 比如feature分支上正在开发,代码写了一半,突然生产报bug,收到报障

2 当前代码是半成品,不方便提交,要把当前工作现场"储藏"起来,等以后恢复现场后继续工作,用git stash,工作区放心地创建分支来修复bug

3 按照master为基线新建bug分支

4 在hotfix分支上修复完bug

5 修复完成后,切换到master分支并完成合并,最后删除刚才的bug分支

6 回到之前的工作现场,工作区是干净的,刚才的工作现场存到哪里去了?用git stash list查看

7 需要恢复一下,有两个办法

① 用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除

git stash apply:取出栈顶的包裹,但包裹仍留在存储柜中。(就像复制了一份)

② 用git stash pop,恢复的同时把stash内容也删了

git stash pop:取出栈顶的包裹,同时从存储柜中删除它。(就像从柜子里拿出东西后扔掉包装)

6.2.4 工作流程小总结

假设你正在某个分支上工作:

正在编码时,街道一个紧急Bug任务。

存储当前工作

切换分支去修复bug

回到功能分支并恢复工作

继续之前的工作

6.3 git cherry-pick

能干吗?

撤回已经push的error代码+不浪费自己本地劳动成果

6.3.1 问题

已经push到远程库了,发现一部分代码OK,一部分代码不合适,需要酌情处理,存在误提交

本地先Revert恢复,但是远程库还存在,需要本地push让远程也OK

本地

远程还有

但是remote仓库还是不合适代码,需要本地push,两者保持一致

到此步骤,远程误提交需要酌情处理的已经完成,外患已除,内忧?

那部分正确的代码怎么办?重写一篇或者外部粘贴?

我们需要:

既要把远程库的误操作干掉,又要把本地正确的劳动成果保留,不能被删除

6.3.2 cherry步骤

6.3.2.1 Cherry-Pick
6.3.2.2 摘樱桃执行后
6.3.2.3 提交内容解除绑定(洗干净才能吃)
6.3.2.4 解绑后恢复到未commit状态
6.3.2.5 将当前代码暂存,Stash执行OK
6.3.2.6 新建devTemp临时分支并切换
6.3.2.7 切换到devTemp临时分支后UnStash

运用UnStash

执行Pop

恢复效果

保留正确的劳动成果,删除错误的隐患,处理后在本分支add-commit

6.3.2.8 切换回feature分支并把devTemp分支内容合并进来,再删除devTemp分支
6.3.2.9 success

6.4 git merge(合并)VS git rebase(变基)

6.4.1 fetch vs pull

git fetch

你可以把它理解为"检查更新"或"预览远程变化"

作用:从远程仓库下载最新的元数据和对象(如提交、分支、标签),但不会修改你本地的工作目录或当前分支,仅仅是安全地查看远程变化情况

git pull

git pull = git fetch + git merge

作用:git pull 实际上是 git fetch + git merge 的组合。如果你直接pull,可能会立即遇到合并冲突。而先fetch,你可以先审查更改,再决定何时merge,流程更可控。

小总结

养成先fetch后,再检查,然后决定是否merge的习惯,是更安全、更专业的Git工作流

6.4.2 merge vs rebase

git merge(合并)

git rebase(变基)

小总结

git merge 和 git rebase都是用于整合不同分支代码的命令,但它们的方式和最终产生的项目历史记录有本质区别

6.4.3 案例

模拟两个开发先后提交到远程库,然后协作,模拟各种状况

6.4.3.1 正常流程(fetch→pull→push)

远程服务器上,另一位开发张三提交了代码,远程比我新,但我不知情


自己本地修改,add-commit,看分支信息提示你本地有改动,可以提交了


此时,直接push到远程,可以吗?

不能直接无脑粗暴的强推
正常操作

git fetch

结论


自然要找找不同,远程gitee/github服务器比我新了哪些东西 ?


本地feature分支和远程feature对比


根据差异结果,判定是否需要合并及解决冲突


git pull
合并


解决冲突


合并代码


git push

success
查看提交日志和远程库历史记录

6.4.3.2 直接粗暴push

远程服务器上张三同学先提交了,我本地修改提交

1 远程更新

2 本地更新,add-commit


本地我违规流程,直接粗暴push,不管不顾


Which One


本次我们先选择merge并处理冲突


再Push

本地+远程都OK

6.4.3.3 上面两次副作用

本地idea-log


远程gitee历史提交记录


结论

提交基线是弯曲的......

后续查找日志,都是充斥大量合并默认记录

6.4.3.4 git pull --rebase

远程服务器上,张三同学先提交了,我本地修改提交

1 远程更新

2 本地更新 add-commit
update project...


git pull --rebase


解决冲突


push到远程

查看基线

相关推荐
workflower2 天前
软件需求变更
嵌入式硬件·压力测试·团队开发·需求分析·规格说明书
終不似少年遊*2 天前
【Git使用】Git 团队开发常用命令汇总手册
git·团队开发·开发工具·使用手册·项目提交
小小8程序员6 天前
室内设计效果图速成:3ds Max 安装 建模 + 渲染全攻略下载安装教程
团队开发
꒰ঌ小武໒꒱6 天前
编程规范:团队协作的隐形桥梁
团队开发
workflower7 天前
典型用户的价值
压力测试·团队开发·需求分析·个人开发·结对编程
行走的陀螺仪8 天前
GitLab CI/CD 完整教学指南
前端·ci/cd·gitlab·团队开发·自动化测试部署
逻辑棱镜11 天前
Git 分支管理与提交信息规范 (v1.0)
git·github·团队开发·代码规范·敏捷流程
帅次12 天前
系统分析师:系统规划与分析的系统规划概述、项目的提出和选择、系统分析概述以及问题分析
软件工程·团队开发·软件构建·需求分析·敏捷流程·设计规范·规格说明书
xixingzhe212 天前
技术团队中角色、责任
团队开发