Git综合实战:从零搭建项目、团队协作、自动化流程、发布管理全流程

说实话,很多同学学完Git的基本操作后,最困惑的就是——这些命令到底怎么串起来用?

我见过太多人,单独问「git merge怎么用」答得头头是道,一放到真实项目里就手忙脚乱。今天咱们就拿一个完整的项目来走一遍,从零开始,一直到发布上线。你跟着我走完这一趟,以后自己带项目心里就有底了。

一、项目初始化:从零开始

假设我们现在要做一个「在线任务看板」系统。团队5个人,我作为技术负责人来搭这个架子。

第一步:创建远程仓库

我个人习惯用GitHub,当然GitLab、Gitee都行。在网页上点「New repository」,名字叫task-board,选私有仓库。

然后回到本地,开始干活:

mkdir task-board
cd task-board
git init
echo "# 任务看板系统" > README.md
git add .
git commit -m "chore: 初始化项目,添加README"

嗯,这里有个小细节——我习惯在commit message里加前缀。chore:表示杂务,feat:表示新功能,fix:表示修bug。这个习惯帮我省了不少事,后面你就知道了。

git remote add origin git@github.com:yourname/task-board.git
git push -u origin main

为什么要加-u?说白了就是告诉Git:「以后我直接敲git push就推到这个分支,不用每次都指定」。我刚开始学的时候老忘加,每次都要多打几个字,烦得很。

二、分支策略:团队协作的基石

团队协作最怕什么?最怕大家在同一根绳子上改代码,改着改着就打架了。

我推荐的分支模型是这样的:

分支名称 用途 谁可以推
main 生产就绪代码,永远可部署 只有通过PR合并
develop 日常开发集成分支 开发者通过PR合并
feature/* 具体功能开发 个人推送
hotfix/* 紧急修复 维护者推送

举个例子,小张要开发「拖拽排序」功能:

git checkout -b feature/drag-sort develop
# 写代码...
git add .
git commit -m "feat: 实现任务卡片拖拽排序"
git push origin feature/drag-sort

然后他在GitHub上发起Pull Request,目标分支选develop。我来做Code Review,没问题就合并。

我的个人经验:PR的描述里一定要写清楚「改了啥、为什么改、怎么测试」。我曾经因为PR描述写得太简单,同事看不懂,来回问了5次才合并——浪费了整整一下午。

三、自动化流程:让机器干机器的活

人总会犯错,但机器不会。所以我们要把重复的事情交给CI/CD。

我在项目根目录下创建.github/workflows/ci.yml

name: CI Pipeline

on:
  push:
    branches: [ develop, main ]
  pull_request:
    branches: [ develop, 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

这个配置的意思是:只要有人往developmain推代码,或者发起PR,就自动跑测试和代码检查。

为什么会这样?因为有一次我合并了一个PR,结果发现测试没通过——原来提交者忘了跑测试。从那以后,我就把「自动跑测试」写进了CI,不通过就不让合并。

注意:CI配置里一定要加npm ci而不是npm installnpm ci会严格按照package-lock.json安装,不会偷偷升级依赖版本。我曾经因为npm install自动升级了小版本,导致生产环境出了个诡异的bug,查了两天才找到原因。

四、发布管理:版本号的艺术

项目开发了一段时间,功能攒够了,准备发第一个正式版本。

我遵循语义化版本规范:主版本.次版本.修订号

  • 修bug:递增修订号,比如1.0.01.0.1
  • 加功能(向后兼容):递增次版本,比如1.0.01.1.0
  • 大改(不兼容):递增主版本,比如1.0.02.0.0

发布流程是这样的:

# 从develop创建发布分支
git checkout -b release/1.0.0 develop

# 更新版本号
npm version 1.0.0

# 生成变更日志
git log --oneline --no-decorate develop..release/1.0.0 > CHANGELOG.md

# 合并到main
git checkout main
git merge --no-ff release/1.0.0
git tag -a v1.0.0 -m "版本1.0.0:初始发布"
git push origin main --tags

# 合并回develop
git checkout develop
git merge --no-ff release/1.0.0

这里我用了--no-ff,也就是禁止快进合并。为什么?因为我想保留分支历史,一眼就能看出「哦,这个commit是从release分支合并进来的」。你想想看,如果用了快进合并,所有commit就变成一条直线,根本分不清哪个是发布节点。

五、知识体系总览

下面这张图,是我对这个全流程的理解。你看一遍,心里就有谱了:

Git综合实战全流程 1. 项目初始化 git init / remote add 2. 分支策略 feature/develop/main 3. 自动化CI GitHub Actions 4. 发布管理 release/tag/CHANGELOG 5. 团队协作 PR / Code Review 6. 持续维护 hotfix / 版本迭代 持续迭代 核心原则: • main分支永远可部署,develop分支用于日常集成 • 每个功能一个feature分支,完成后通过PR合并 • 发布前创建release分支,打tag标记版本

六、避坑指南:我踩过的那些坑

最后分享几个我亲身经历的血泪教训:

坑1:直接在main上改代码

我曾经有一次觉得「就改一行配置,不用走流程了」,直接在main上改了然后推送。结果那行配置写错了,导致整个生产环境挂了20分钟。从那以后,我立了规矩:main分支必须保护,任何人都不能直接推。

坑2:合并冲突处理不当

有次小张和小李同时改了同一个文件的不同部分,合并时产生了冲突。小张没仔细看,直接把冲突标记删了就提交了——结果把小李的代码全删了。我的建议是:遇到冲突别慌,用git mergetool或者IDE的对比工具,逐行确认。

坑3:忘记打tag

项目上线后,客户反馈有个bug。我查了半天才发现——线上跑的代码跟最新的main不一样,因为上次发布后忘了打tag,后来有人又合并了其他代码。现在我的习惯是:每次发布必须打tag,而且tag名必须跟版本号一致。

好了,这一整套流程走下来,你应该能感受到Git在真实项目中的用法了。说白了,Git本身不难,难的是怎么把它用对、用好。你按照这个流程去实践,遇到问题再回来翻翻,慢慢就熟练了。


公众号:蓝海资料掘金营,微信deep3321