4、版本控制与分支策略:Git基础操作、GitFlow工作流、主干开发模式、代码Review流程

版本控制这件事,说白了就是团队的「后悔药」和「时光机」。我见过太多项目因为版本管理混乱,最后上线时都不知道该发布哪个版本。嗯,今天我们就来聊聊Git的那些事儿。

4.1 Git基础操作:你每天都在用的那些命令

Git的基本操作,其实你每天都在用。但很多人只是机械地敲命令,并不理解背后的原理。我个人习惯把Git操作分为三类:本地操作、远程交互、分支管理。

4.1.1 本地操作三板斧

# 初始化仓库
git init

# 添加文件到暂存区
git add .

# 提交到本地仓库
git commit -m "feat: 添加用户登录功能"

这里有个坑,我踩过好几次。就是git add .会把所有文件都加进去,包括那些不该提交的临时文件。所以我建议你养成好习惯,先git status看看哪些文件变了,再用git add指定文件。

4.1.2 远程交互要小心

# 拉取最新代码
git pull origin main

# 推送本地提交
git push origin feature/login

我曾经在项目中遇到过,有人直接git push --force把别人的提交给覆盖了。那场面,简直是一场灾难。记住,--force是核武器,能不用就别用。

⚠️ 警告: 永远不要在公共分支上使用 git push --force。如果确实需要强制推送,先和团队沟通,确保没人正在基于你的分支工作。

4.2 GitFlow工作流:经典的分支模型

GitFlow是我最早接触的分支策略,它把分支分得很细。说实话,刚开始我觉得挺复杂的,但用久了发现,它确实能应对复杂的发布场景。

4.2.1 核心分支

分支类型 命名规则 用途
主分支 main / master 生产环境代码,只接受合并
开发分支 develop 日常开发集成,功能分支的基线
功能分支 feature/* 开发新功能,从develop拉出
发布分支 release/* 准备发布版本,从develop拉出
热修复分支 hotfix/* 紧急修复生产问题,从main拉出

4.2.2 工作流程

# 1. 从develop创建功能分支
git checkout -b feature/login develop

# 2. 开发完成后合并回develop
git checkout develop
git merge --no-ff feature/login

# 3. 准备发布时创建release分支
git checkout -b release/1.2.0 develop

# 4. 修复bug后合并到main和develop
git checkout main
git merge --no-ff release/1.2.0
git tag -a v1.2.0 -m "版本1.2.0"

git checkout develop
git merge --no-ff release/1.2.0
💡 小技巧: 使用 --no-ff 参数可以保留分支历史,方便以后追溯。我个人习惯所有合并都加这个参数。

4.3 主干开发模式:简单粗暴但有效

主干开发模式,说白了就是大家都在一条主干上干活。你想想看,如果团队只有5个人,搞那么复杂的分支策略是不是有点多余?

4.3.1 核心原则

  • 所有开发都在main分支上进行
  • 提交要小而频繁,最好每天多次
  • 通过特性开关控制功能上线
  • 代码必须通过CI/CD才能合并

4.3.2 什么时候用主干开发?

我在项目中遇到过这样的情况:一个10人的小团队,用GitFlow搞得大家天天合并冲突。后来我们切换到主干开发,效率反而提升了。主干开发适合:

  • 小团队(10人以下)
  • 持续交付成熟度高的团队
  • 功能粒度小的项目
  • 有完善的自动化测试覆盖
🔑 关键点: 主干开发不是没有分支,而是分支的生命周期很短。通常一个分支只存在几个小时,而不是几天或几周。

4.4 代码Review流程:不只是找bug

代码Review这件事,很多人觉得就是找bug。其实不然,它更重要的目的是知识传递和代码规范统一。我见过最差的Review就是「LGTM」三个字母就完事了。

4.4.1 Review流程

1. 开发者创建Pull Request
2. 填写PR描述(做了什么、为什么、怎么测试)
3. 指定Reviewer(至少2人)
4. Reviewer逐行审查
5. 提出修改意见
6. 开发者修改后重新请求Review
7. 所有Reviewer批准后合并

4.4.2 Review清单

检查项 具体内容
功能正确性 代码是否实现了需求?边界情况处理了吗?
代码质量 命名是否清晰?函数是否过长?有没有重复代码?
安全性 有没有SQL注入风险?用户输入是否校验?
性能 有没有不必要的循环?数据库查询是否优化?
可测试性 代码是否容易写单元测试?有没有依赖注入?
⚠️ 避坑指南: 我曾经见过一个团队,Review时只关注代码风格,忽略了严重的逻辑错误。结果上线后出了大问题。记住,功能正确性永远比代码风格重要。

4.5 如何选择分支策略?

你可能会问,到底该用哪种分支策略?我的建议是:

  • 小团队、快速迭代 → 主干开发模式
  • 多版本并行、复杂发布 → GitFlow
  • 介于两者之间 → GitHub Flow(简化版GitFlow)

其实没有银弹。我在不同项目里用过不同的策略,关键是要适合团队当前的规模和节奏。嗯,记住一点:分支策略是为团队服务的,不是反过来。

💡 我的建议: 刚开始用GitFlow,等团队成熟了再考虑切换到主干开发。不要一上来就搞最复杂的,容易把团队搞懵。

好了,这一章的内容就到这里。下一章我们会聊聊持续集成和持续部署,那是让代码真正跑起来的环节。