Git的正确使用姿势与最佳方式(下)| 青训营笔记

161 阅读4分钟

在上一篇笔记,介绍了创建项目、git初始化,再到git remote推送代码至远程仓库,完整地走了一遍创建并推送的流程,顺带实践了免密配置等操作,补充几个内容,remote 所分的ssh和http的区别在于,ssh是设置内部地址,http是设置外部地址,所以需要设置免密。key分为四种,这里只讲默认的和推荐的,默认的是rsa,但出于安全考虑,推荐使用ed25519。

这篇笔记讲讲使用Git研发流程 我们知道,团队开发项目,需要代码管理平台来提供支持,可以做到追溯历史版本、回退、保护分支等操作。非常需要弄清楚的是,团队协作的流程是怎样的,如何操作合情合理。实际的开发中难免会遇到问题。

1. 常见问题
(1). 在Gerrit平台使用Merge方式合入代码

Gerrit是集中式工作流,不建议用Merge,应该在主干分支开发后直接push

(2). 不了解保护分支

保护分支是为了防止用户直接向主干分支提交代码,必须通过PR合入

Code Review,Cl: 都是在合入前的检查策略,其中Code Review是人工检查,Cl则是利用定制化脚本检查

(3). 代码历史混乱、代码合并方式不清晰

不理解Fast-forward和Three-Way Merge区别,本地代码在更新的时候频繁使用Three Way的方式,导致生成过多的Merge节点。

2. 工作流
(1). 集中式工作流
  • 特点:只针对主干分支进行开发,不存在其他分支。
  • 代表平台:Gerrit/SVN
  • 合入方式:Fast-forward
  • 工作方式:获取远端master代码,直接在master分支修改,提交前拉取最新的master代码和本地代码进行合并(rebase),有冲突就解决冲突,最后提交本地代码到master
  • (大概了解就行,更多情况下是使用的分支管理工作流)
(2). 分支管理工作流
  • 特点:定义不同特性的开发分支、上线分支,在开发分支完成开发后,再通过MR/PR合入主干分支
  • 代表平台:Github/Gitlab
  • 合入方式:Fast-forward、自定义、Three-Way Merge
分支管理工作流特 点
Git Flow分支类型丰富,规范严格
Github Flow规则简单,只有主干分支和开发分支
Gitlab Flow在主干分支和开发分支之上构建环境分支,版本分支,满足不同发布或环境需要
3. 分支管理工作流
(1). Git Flow

是早期分支管理策略

五种类型分支
  • master:主干分支
  • develop:开发分支
  • feature:特性分支
  • release:发布分支
  • hotfix:热修复分支
优点

严格按照定义的标准执行,代码将会清晰难以出现混乱

缺点

流程复杂,上线节奏慢,导致研发有一定概率不按标准执行导致代码混乱

(2). Github Flow

基于Pull Request向主干分支提交代码

团队合作方式(在owner创建仓库后)
  • (第一种)其他用户通过fork的方式创建自己的仓库,并且在fork的仓库进行开发
  • (第二种)统一给团队内成员分配权限,直接同一个仓库内进行开发

创建Pull Request:

  • 创建main主分支
  • 创建feature分支
  • 创建feature到main的Pull Request
(3). Gitlab Flow

在Git Flow和Github Flow做出优化,保持了单一分支的简便,同时适应不同的开发环境

  • 上游优先原则:上游分支通常是master,假如项目的成员向代码仓库提交代码,只有master分支使用者采纳才可以进入下游分支。
代码合并
  • Fast-Forward:不会产生merge节点,合并后保持一个线性历史,如果target分支更新,需要rebase操作更新source branch后才可以合入。
  • Three-Way Merge:三方合并,会产生一个新的merge节点
4. 选择工作流的原则
对小型团队合作,使用GitHub
  • 不要一次性上传过多代码(上千行、上万行显然是行不通的),应该少量多次
  • 提交Pull Request后需要保证有CR后再合入
  • 主干分支要保持整洁,使用fast-forward合入方式,合入前进行rebase
大型团队合作,可以灵活变通(根据实际需求)