Git分支说明
master分支git默认分支,主分支,不轻易改动,代码为生产环境的最新发布版本。在新版本发布后,需要将新版本代码合并到该分支,并在改分支上打tag。 | 命名规范 | 分支来源 | 分支目标 | 合并来源 | 合并目标 | 权限 | 应用环境 | | —- | —- | —- | —- | —- | —- | —- | | - | - | developfix- | release-fix-* | - | ⽆ Push 权限 | 生产 |
develop分支是开发人员使用的主要分支,以master为分支来源。其最新代码代表着开发人员为下一个发布版本提交的最新代码。不能代表最新的特性代码,也不代表正在发布的版本代码。禁止将下列分支合并到develop分支: | 命名规范 | 分支来源 | 分支目标 | 合并来源 | 合并目标 | 权限 | 应用环境 | | —- | —- | —- | —- | —- | —- | —- | | - | master | feature-release- | feature-release-fix-* | - | ⽆ Push 权限 | - |
- 新功能未完成的feature分支;
- 测试环境未通过的release分支;
- 问题为修复的fix分支。
feature分支feature分支,新功能分支,主要用于即将开放的或周期更长期的功能分支。有可能合并到develop分支或者废弃掉。feature分支的创建规则取决于需求复杂程度和开发人员数量,需要考虑开发效率、冲突出现的频次和解决冲突需要花费的时间和精力。如果开发人员较少,可以使用一个分支进行开发,命名规则采用feature-appversion,示例:feature-1.0.0;如果开发人员较多,需求相对复杂,可以每个开发人员一个分支,命名规则feature-appversion-name,示例:feature-1.0.0-lss;如果需求特别多而复杂,可以每个需求一个分支,命名规则feature-appversion-function,示例:feature-1.0.0-ble。 | 命名规范 | 分支来源 | 分支目标 | 合并来源 | 合并目标 | 权限 | 应用环境 | | —- | —- | —- | —- | —- | —- | —- | | feature-AppVersionfeature-AppVersion-DeveloperName | develop | - | - | develop | all | 开发 |
release分支release分支专供测试使用,允许发布前,做最后一点改动(修改bug,版本信息等)。测试通过验证后,再合并到develop分支,开始下一个版本的开发工作。命名示例:release-1.0.0 | 命名规范 | 分支来源 | 分支目标 | 合并来源 | 合并目标 | 权限 | 应用环境 | | —- | —- | —- | —- | —- | —- | —- | | release-AppVersion | develop | - | - | develop master | Push 权限 | 测试 |
release-fix分支release-fix分支主要是用来修复当前release分支的bug。release-fix分支可以由开发人员创建,并且推送到origin,可由多位开发者共同修复各自开发代码产生的bug。每次修复完bug,直接打包给测试,测试通过后,发送MR请求到release分支。命名示例:release-fix-1.0.0。 | 命名规范 | 分支来源 | 分支目标 | 合并来源 | 合并目标 | 权限 | 应用环境 | | —- | —- | —- | —- | —- | —- | —- | | release-fix-AppVersion | release-AppVersion | - | - | release-AppVersion | all | 开发/测试 |
fix分支fix分支用于解决生产环境发现的BUG。当生产环境发现BUG后,基于最新一次发布App的版本号,创建 fix 分支进行BUG修复。规范命名的 count 为该版本 | 命名规范 | 分支来源 | 分支目标 | 合并来源 | 合并目标 | 权限 | 应用环境 | | —- | —- | —- | —- | —- | —- | —- | | fix-AppVersionc | master | - | - | develop | all | 测试/生产 |
optimize分支优化代码分支,如果项目中使用的某个技术已经过时,或者随着技术的提升,感觉之前的代码有更好的实现,在时间允许的情况下,可以考虑优化该部分代码。也可以将一些公共的工具类,公共使用的代码放到这个分支。考虑到新代码可能出现BUG,经过严格测试后,才允许合并到 develop 分支,否则仅仅作为个人技术练习。命名规范中的 content 为准备优化的地方,例如:optimize-layout-layer。feature 分支 和 optimize 分支区别:feature 分支靠需求驱动,optimize 分 靠技术驱动。fix 分支 和 optimize 分支区别:fix分支一定会在下一个版本上线,而 optimize 分支不一定在下一个版本上线。 | 命名规范 | 分支来源 | 分支目标 | 合并来源 | 合并目标 | 权限 | 应用环境 | | —- | —- | —- | —- | —- | —- | —- | | optimize-content | develop | - | - | develop | all | 开发 |
Git使用流程
1.创建项目
- 在 Gitlab 上创建项目,将项目拉取到本地。
- 创建以下文件:
- README.md :工程说明;
- CHANGELOG.md:变更说明日志,记录每个版本做的事情,类似于应用市场上发布的版本说明;
- .gitignore:配置不需要 Git 进行管理的文件。
- 将修改提交到远程,这个时候Git 会默认创建 master 分支。
-
2.新功能开发
基于 develop 分支创建 feature 分支。
- 按照需求和UI完成开发任务。
- 联调代码,完成自测。
- 如果本次开发创建了多个 feature分支,将其合并到一个 feature 分支上,如果只是一个 feature 分支,则不进行操作。
- 拉取 develop 分支上的代码到 feature 分支,如果存在冲突,解决冲突。
提交 MR 到 develop 分支,MR 通过后删除 feature 分支。
3.测试新功能
检查 MR 到 develop 上的代码,确认后,同意 MR。
- 基于 develop 分支创建 release-version 分支,修改应用 versionCode 和 versionName,更新 CHANGELOG.md 文件中的说明日志。
- 在 release-version 上打测试环境的安装包,提交给测试人员进行测试。
- 如果测试人员发现BUG,基于 release 创建 release-fix 分支修复BUG,BUG修复后直接在 release-fix分支打测试环境的安装包,提交给测试人员进行测试。
- 重复步骤4,直到测试通过。
提交 MR 到 release 分支,MR 通过后删除 release-fix 分支。
4.发布新版本
基于 release 分支打正式包,提交到应用市场。
- 提交 MR 到 master 分支,同意后,在 master 分支上打对应版本的 tag,tag的命名规则为 v + version,示例:v1.0.0。
提交 MR 到 develop 分支,MR 通过后删除 release 分支。
5.修复线上BUG
基于 master 分支,使用最新一次发布App的版本号,创建 fix 分支进行BUG修复。
- BUG修复后直接在当前分支打测试环境的安装包,提交给测试人员进行测试。
- 测试未通过,继续修复。
如果需要立即发版,则基于 fix 分支创建 release 分支,修改应用 versionCode 和 versionName,更新 CHANGELOG.md 文件中的说明日志,删除 fix 分支,剩余步骤参考\4. 发布新版本完成发版。如果不严重,则提交 MR 到 develop 分支,MR 通过后删除 fix 分支。
6.优化代码
基于 develop 分支,创建 optimize 分支。
- 完成优化。
- 测试优化。
- 提交 MR 到 develop 分支,MR 通过后删除 optimize 分支。
提交规范
Git 每次提交代码,都要写 Commit message(提交说明),否则就不允许提交。一般来说,commit message 应该清晰明了,说明本次提交的目的,包括:代码作用的位置、代码变动的类型、简要描述代码的功能。
变动类型 | 描述 |
---|---|
feat | 新功能(feature) |
fix | 修复bug |
docs | 文档的变动,注释的变动 |
style | 代码格式的变动,比如:方法顺序、字段顺序、方法命名、字段命名等。 |
refactor | 对已上线代码进行优化,不涉及到需求,只是从技术上去优化代码 |
test | 测试的变动 |
chore | 构建过程、辅助工具、编辑器配置的变动 |
示例:
fix(首页):修复缓存异常
feat(用户):新增修改用户头像的功能
注意:每次提交代码前,应该先执行 pull 拉取服务器最新代码,防止提交的代码有冲突。
而且如果先创建本地提交,然后在执行更新操作,这样会导致 Git 自动生成一个合并提交,导致提交历史不够简洁。
常用Git命令示例
1. 创建分支
这里以在本地创建 feature 分支举例,其他分支创建需要注意是基于哪个分支创建,同事还需要注意分支命名规则。
// 切换到 develop 分支
git checkout develop
// 基于 develop 分支创建 feature 分支
git checkout -b feature-1.0.0
// 将 feature 分支推送到远程
git push origin feature-1.0.0:feature-1.0.0
// 设置本地 feature 分支关联远程 feature 分支
git branch —set-upstream-to=origin/feature-1.0.0 feature-1.0.0
2. 删除分支
// 删除本地分支
// 一般删除,如果分支上的代码没有合并,会失败
git branch -d feature-1.0.0
// 强制删除
git branch -D feature-1.0.0
// 删除远程分支
git push origin —delete feature-1.0.0
// or
git push orgin :feature-1.0.0 //(origin 和冒号之间是有空格的)
3. 更新代码
4. 添加Tag
// tag 一般在 master 分支添加,所以先切换到 master 分支
git checkout master
// 添加 tag
git tag -a v1.0.0 -m ‘tag描述,一般来说就是一句话描述新增代码的功能’
MR使用规范
1. 创建MR请求
1.在项目的仓库主页中找到Create Merge request
2.填写请求内容
注意Title和内容的的填写规范:可参考MR注释规范,确认分支来源、目标分支和委托人不要填写错误。
分支说明:
2. 处理MR请求
Gitlab 会通过邮件通知到委托人,处理 MR。
1.查看 MR 中代码改变了哪些。
2.确认没有问题,通过 MR,合并完成。如果发现有问题,则关闭请求,合并失败,需要请求人修改代码后重新MR.
3. MR注释规范
所有的 MR 请求者,需要详细说明提交注释,如下:
源分支 | 目标分支 | 注释Title | Descrition |
---|---|---|---|
release | masterdevelop | release-version 测试已通过,提交发布 示例:release-1.0.0 测试已通过,提交发布 | - |
feature | develop | feature-version 完成所有功能的开发并联调通过,提交测试 示例:feature-1.0.0 完成所有功能的开发并联调通过,提交测试 | - |
fix | develop(线上Bug下次发版) | fix-version 修复了以下bug并测试通过,提交合并fa’bu 示例:fix-1.0.0 修复了以下bug并测试通过,提交合并 | 1. bug1 2. bug2 3. bug3 |
fix | master(线上Bug立即发版) | fix-version 修复了以下bug并测试通过,提交发布 示例:fix-1.0.0 修复了以下bug并测试通过,提交发布 | 1. bug1 2. bug2 3. bug3 |
release-fix | release | release-fix-version 修复了以下bug并测试通过,提交发布 示例:release-fix-1.0.0 修复了以下bug并测试通过,提交发布 | 1. bug1 2. bug2 3. bug3 |
代码评审
在两个及两个以上开发人员的项目中,应该进行代码评审,检查代码风格和是否有潜在的BUG。
考虑到开发时间,MR时需要做简易 Code Review,项目发布后做详细 Code Review,如果需要调整代码,新建优化分支进行调整,具体流程参考优化代码
注意事项
1. 避免代码冲突
为了尽量避免冲突发生,养成如下开发习惯:
- 编码前先更新
- 提交前先更新
- 修改了公共文件,尽早通知其他成员更新
- 需要提交 MR 到目标分支,先将目标分支的代码拉到当前分支,如果有冲突,先解决冲突再 MR,没有冲突则直接提交MR。
- 最后一条,也是最重要的,团队分工要明确
2. 更新代码使用Merge而不是Rebase
这里不使用 rebase,原因是会把当前分支的 commit 放到公共分支的最后面,所以叫变基。就好像你从公共分支又重新拉出来这个分支一样,改变了commit 的实际提交顺序,这样其他从这个公共分支拉出去的人,都需要再 rebase。1. 使用命令行更新代码
git pull —no-rebase2. 使用Android Studio更新代码
按下图配置更新选项:
补充:
Update Type 类型:
- Merge:更新时执行合并操作。等价于执行git fetch && git merge或者git pull —no-rebase。
- Rebase:更新时执行rebase操作。等价于执行git fetch && git rebase或者git pull —rebae。
- Branch Default:在.git/config文件中指定不同分支的更新类型。
参考
Git使用规范 Android 版
Android开发规范:Git版本管理规范
Android团队项目开发之统一代码规范
Android - 代码管理