版本控制基础:Git核心概念与CI/CD集成
说实话,版本控制这件事,我见过太多团队栽跟头了。有的项目代码乱成一锅粥,有的合并冲突能吵一整天。其实核心就那几个概念,搞明白了,后面的事就顺了。
Git核心概念:仓库、提交、分支、合并
先聊聊仓库。仓库说白了就是你的项目文件夹加上Git的"小本本"。这个小本本记录着每一次改动。我个人习惯,新项目第一件事就是 git init,把项目纳入版本控制。
仓库的两种形态:
- 本地仓库:你电脑上的 .git 文件夹,存着所有历史记录
- 远程仓库:托管在 GitHub/GitLab 上的副本,方便团队协作
提交是Git的灵魂。每次提交就像给代码拍了一张快照。我经常跟团队说:提交要小、要频繁、要有意义。别攒了一周的改动一次性提交,那谁也看不懂。
# 好的提交习惯
git add src/utils/helper.js # 只提交相关文件
git commit -m "fix: 修复日期格式化时区问题" # 写清楚改动原因
分支这东西,我刚开始用的时候也犯过迷糊。其实很简单——分支就是一条独立的时间线。主分支(main/master)是稳定的,开发分支(develop)是日常工作的,功能分支(feature/*)是干活的。
我的经验:分支命名要规范。我一般用 feature/xxx、bugfix/xxx、hotfix/xxx 这样的前缀。团队一看就知道这个分支在干嘛。
合并嘛,就是把两条时间线接起来。这里有个坑——合并冲突。我曾经因为一个配置文件冲突,折腾了半小时。后来学乖了,合并前先 git pull --rebase,把本地提交放到最新代码上面,冲突少很多。
Git工作流:GitFlow vs Trunk-Based
工作流这东西,没有银弹。我两种都用过,说说我的感受。
| 特性 | GitFlow | Trunk-Based |
|---|---|---|
| 分支数量 | 多(main, develop, feature, release, hotfix) | 少(主要就 main 和短生命周期分支) |
| 适合场景 | 大型项目、版本发布周期长 | 持续交付、微服务、小团队 |
| 合并频率 | 低(按版本合并) | 高(每天合并多次) |
| 学习成本 | 较高 | 低 |
GitFlow 适合那种有固定发布周期的项目。比如一个月发一个版本,有专门的测试阶段。我在做企业级项目时用过,分支管理很清晰,但确实有点重。
Trunk-Based 是我现在更偏好的方式。说白了就是大家都在主干上开发,分支只存活一两天。你想想看,这样合并冲突少,CI跑得快,出了问题也容易回滚。
注意:Trunk-Based 对自动化测试要求很高。没有充分的测试覆盖,频繁合并到主干就是灾难。我曾经在一个测试覆盖率只有30%的项目上强推Trunk-Based,结果...嗯,那周我加了三天班。
代码托管平台的CI/CD集成
GitHub和GitLab都内置了CI/CD能力。说白了就是:你推代码,它自动跑测试、构建、部署。
GitHub Actions 的配置很直观。我一般这样写:
# .github/workflows/ci.yml
name: CI Pipeline
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: 安装依赖
run: npm ci
- name: 运行测试
run: npm test
- name: 代码质量检查
run: npm run lint
GitLab CI 的配置类似,但用 .gitlab-ci.yml:
# .gitlab-ci.yml
stages:
- test
- build
- deploy
unit-test:
stage: test
script:
- npm ci
- npm test
only:
- main
- merge_requests
我的建议:CI流水线要快。超过10分钟的流水线,开发者就会开始摸鱼等结果。我一般把单元测试和集成测试分开,单元测试跑在PR阶段,集成测试跑在合并后。
知识体系总览
下面这张图是我自己整理的版本控制知识体系。你看一眼,心里就有谱了。
这张图把今天的内容串起来了。从Git核心概念出发,到工作流选择,再到CI/CD集成,每一步都有讲究。我个人觉得,版本控制这件事,70%靠规范,30%靠工具。规范定好了,工具只是辅助。
一句话总结:仓库是家,提交是日记,分支是平行宇宙,合并是时空交汇。工作流选适合团队的,CI/CD让机器替你跑腿。