前言#
如果你正在和团队一起使用 GitHub 管理代码,或者参与开源项目贡献,你一定遇到过这样的困惑 Message 该怎么写?分支该如何管理?Pull Request 要遵循什么规则?这些看似简单的问题,实际上直接影响着项目的可维护性和团队协作效率。
开发团队需要通过规范的工作流程来管理代码版本,本文将系统地介绍 GitHub 的使用规范,包括 Commit 提交规范、分支管理策略、Pull Request 流程以及项目文档规范。无论你是刚接触 GitHub 的新手,还是想优化团队协作流程的开发者,都能从中找到实用的建议。
读完这篇文章,你将掌握:
- 如何写出清晰规范的 Commit Message
- 如何选择适合团队的分支管理策略
- 如何正确地发起和审查 Pull Request
- 如何建立规范的开源项目结构
Commit Message 提交规范#
为什么需要规范的 Commit Message#
通过阅读提交信息就可以在不用阅读代码的情况下大概了解此版本的改动内容。规范的提交信息不仅帮助团队成员理解代码变更,还能:
- 快速浏览项目历史,了解功能演进
- 自动生成 CHANGELOG 文档
- 方便追踪 bug 来源和功能实现
- 提升代码审查效率
Angular 规范#
Angular 提交规范是最早被广泛采用的一套规范,后来演化出了更通用的 Conventional Commits;现在大家通常说的 “业界标准” 更偏向后者。
<type>(<scope>): <subject>
<body>
<footer>
结构说明:
- Header (必填): 包含 type、scope (可选) 和 subject
- Body (可选): 对本次提交的详细描述
- Footer (可选): 关联 Issue 或说明不兼容变动
Header 部分详解#
Type (类型) - 必填
用于说明本次提交的类别,常用类型包括:
feat: 新增功能 (feature)fix: 修复 bugdocs: 文档变更 (documentation)style: 代码格式调整 (不影响代码运行)refactor: 重构 (既不是新增功能,也不是修改 bug)perf: 性能优化test: 增加测试chore: 构建过程或辅助工具的变动ci: CI 配置文件和脚本的变动build: 影响构建系统或外部依赖的变更revert: 回滚某次已经提交的变更
Scope (范围) - 可选
用于说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。例如、Service、API、UI、Database 等。
Subject (主题) - 必填
是对 commit 的一个简短的描述,一般不超过 50 个字符。书写要求:
- 使用祈使语气、现在时态:用 "change" 而非 "changed" 或 "changes"
- 首字母小写
- 结尾不加句号
Body 部分#
Body 用于对本次提交进行详细描述,说明:
- 为什么需要这次改动
- 改动的影响范围
- 与之前行为的对比
一行不超过 72 个字符。
Footer 部分#
Footer 主要用于两种情况:
1. 关闭 Issue
使用关键字可以自动关闭 Issue:
Closes #123- 关闭单个 IssueCloses #123, #456- 关闭多个 Issue- 其他关键字:
Fixes、Resolves、Close、Fix、Resolve
2. 不兼容变动
如果当前代码与上一个版本不兼容,Footer 需要以 BREAKING CHANGE: 开头,说明变动描述、变动理由和迁移方法。
实际示例#
简单示例:
feat(user): add user login feature
fix(api): resolve timeout issue in payment module
docs(readme): update installation guide
完整示例:
feat(shopping-cart): add product quantity selector
Allow users to change product quantity directly in the cart page.
This improves user experience by reducing the number of clicks needed.
Closes #234
包含不兼容变动:
refactor(api): change authentication method
BREAKING CHANGE: The authentication API now requires OAuth 2.0 instead of API keys.
All existing integrations need to be updated to use the new OAuth flow.
See migration guide: docs/migration-oauth.md
使用工具保证规范#
Commitizen - 交互式提交工具
Commitizen 可以提供友好的交互界面,帮助你生成规范的提交信息。
安装和配置:
# 安装 Commitizen
npm install --save-dev commitizen
# 安装 Angular 规范适配器
npm install --save-dev cz-conventional-changelog
# 初始化
npx commitizen init cz-conventional-changelog --save-dev --save-exact
使用方法:
# 使用 git cz 代替 git commit
git add .
git cz
Commitlint - 提交信息校验工具
可以帮助我们 lint commit messages, 如果我们提交的不符合指定的规范,会直接拒绝提交。
安装配置:
# 安装
npm install --save-dev @commitlint/cli @commitlint/config-conventional
# 创建配置文件
echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js
结合 Husky 使用:
# 安装
npm install husky --save-dev
npx husky init
# 添加 commit-msg 钩子
npx husky add .husky/commit-msg 'npx --no-install commitlint --edit "$1"'
这样每次提交时,如果不符合规范就会被拒绝。
分支管理策略#
为什么需要分支管理策略#
如果你不加注意,很可能会留下一个枝节蔓生、四处开放的版本库,到处都是分支,完全看不出主干发展的脉络。合理的分支策略能够:
- 隔离不同功能的开发,避免相互干扰
- 支持并行开发和快速迭代
- 保证主分支代码的稳定性
- 方便版本发布和回滚
Git Flow - 经典的分支管理模型#
Git Flow 是最早被系统化提出、影响力很大的工作流之一,适合有明确发布周期的项目。
主要分支
1. main 分支
- 永远保持稳定可发布状态
- 只能通过合并其他分支来更新
- 每次合并都要打上版本标签 (tag)
2. develop 分支
- 日常开发的主分支
- 包含下次发布的最新开发成果
- 当代码达到稳定状态时,合并到 main 并发布
辅助分支
1. Feature 分支 (功能分支)
Feature 分支用来做分模块功能开发,建议命名为 feature-xxx。
- 从 develop 分支创建
- 开发完成后合并回 develop
- 命名规则:
feature/功能名称或feature-功能名称 - 开发完成后删除
# 创建功能分支
git checkout -b feature/user-profile develop
# 开发完成后合并
git checkout develop
git merge --no-ff feature/user-profile
git branch -d feature/user-profile
git push origin develop
2. Release 分支 (预发布分支)
Release 分支用来做版本发布的预发布分支,建议命名为 release-xxx。
- 从 develop 分支创建
- 用于发布前的测试和小 bug 修复
- 测试通过后合并到 main 和 develop
- 命名规则:
release/版本号或release-版本号
# 创建预发布分支
git checkout -b release/1.2.0 develop
# 修改版本号等准备工作
# 进行测试和 bug 修复
# 合并到 main
git checkout main
git merge --no-ff release/1.2.0
git tag -a v1.2.0 -m "Release version 1.2.0"
# 合并回 develop
git checkout develop
git merge --no-ff release/1.2.0
# 删除分支
git branch -d release/1.2.0
3. Hotfix 分支 (热修复分支)
Hotfix 分支是用来做线上的紧急 bug 修复的分支,建议命名为 hotfix-xxx。
- 从 main 分支创建
- 修复完成后合并到 main 和 develop
- 合并到 main 时打上修复版本标签
- 命名规则:
hotfix/问题描述或hotfix-问题描述
# 创建热修复分支
git checkout -b hotfix/critical-bug main
# 修复 bug
# ...
# 合并到 main
git checkout main
git merge --no-ff hotfix/critical-bug
git tag -a v1.2.1 -m "Hotfix for critical bug"
# 合并到 develop
git checkout develop
git merge --no-ff hotfix/critical-bug
# 删除分支
git branch -d hotfix/critical-bug
GitHub Flow - 简化的工作流#
GitHub Flow 的优点是比 Git Flow 简单,适合 CI/CD(持续集成 / 持续部署)流程的项目。
基本原则:
- main 分支永远是可部署的
- 开发新功能时,从 main 创建描述性的分支
- 定期提交到本地分支,并推送到远程同名分支
- 需要帮助或准备合并时,发起 Pull Request
- 经过审查和测试后,合并到 main
- 合并后立即部署
工作流程:
# 1. 创建功能分支
git checkout -b add-user-avatar main
# 2. 进行开发并提交
git add .
git commit -m "feat: add user avatar upload"
# 3. 推送到远程
git push origin add-user-avatar
# 4. 在 GitHub 上发起 Pull Request
# 5. 代码审查通过后,在 GitHub 上合并到 main
# 6. 合并后立即部署
GitLab Flow - 环境导向的工作流#
GitLab Flow 比 GitHub Flow 多了 staging、production 等分支。它结合了 Git Flow 和 GitHub Flow 的优点,更关注持续集成和持续部署。
核心思想:
- 使用 feature 分支开发
- 通过 Code Review 后合并到 main
- main 作为开发主分支
- 为不同环境创建对应分支、production
- 代码按环境依次推进 → staging → production
适用场景:
- 需要多环境部署的项目
- 强调持续集成和持续部署
- 需要在不同环境验证代码的项目
如何选择分支策略#
选择 Git Flow 如果:
- 项目有明确的版本发布周期
- 需要同时维护多个版本
- 团队规模较大,分工明确
- 对代码质量要求严格
选择 GitHub Flow 如果:
- 项目需要持续部署
- 团队规模较小,沟通顺畅
- 希望保持简单的工作流
- 不需要维护多个生产版本
选择 GitLab Flow 如果:
- 需要在多个环境中验证代码
- 强调 CI/CD 流程
- 需要环境隔离和逐步推进
Pull Request 最佳实践#
什么是 Pull Request#
Pull Request 是一种通知机制。你修改了他人的代码,将你的修改通知原来的作者,希望他合并你的修改,这就是 Pull Request。
PR 的基本原则#
一个 PR 只围绕一件事,避免过大的 PR。具体来说:
1. 单一职责
- 一个 PR 只解决一个问题或实现一个功能
- 不要在同一个 PR 中混入多个不相关的改动
- 如果需要多个功能,分成多个 PR 提交
2. 控制 PR 大小
- 文件改变最好少于 12 个文件 (排除构建产生的文件)
- 代码行数控制在合理范围 (建议不超过 400 行)
- 过大的 PR 难以审查,容易引入问题
3. 清晰的描述
PR 标题和描述要清晰明确:
- 标题格式:
[类型] + 动词 + 名词 + [形容词] + [名词] - 例如:
修复 Collapse 组件无法展开的问题、新增用户头像上传功能
如何发起 Pull Request#
标准流程:
- Fork 目标仓库(如果是外部项目)
- Clone 到本地
git clone https://github.com/你的用户名/项目名.git
cd 项目名
- 创建功能分支
git checkout -b feature/my-feature
- 进行开发并提交
git add .
git commit -m "feat: add new feature"
- 推送到远程
git push origin feature/my-feature
-
在 GitHub 上创建 Pull Request
- 进入你的 Fork 仓库
- 点击 "Compare & pull request"
- 选择正确的 base 分支 (通常是 develop 或 main)
- 填写 PR 标题和描述
- 提交 Pull Request
PR 描述模板#
好的 PR 描述应该包含以下内容:
## 改动说明
简要描述本次 PR 的目的和改动内容。
## 改动类型
- [ ] Bug 修复
- [ ] 新功能
- [ ] 代码重构
- [ ] 文档更新
- [ ] 性能优化
- [ ] 其他(请说明):
## 相关 Issue
Closes #123
Relates #456
## 测试说明
- 测试用例已添加/更新
- 本地测试通过
- 所有 CI 检查通过
## 截图/录屏
(如果有 UI 变动,请提供截图或录屏)
## 额外说明
(其他需要审查者注意的事项)
代码审查要点#
作为 PR 提交者:
- 提交前自己先审查一遍代码
- 确保代码符合项目的编码规范
- 所有测试都要通过
- 及时回应审查意见
- 不要在 PR 中修复审查时发现的无关问题
作为代码审查者:
- 关注代码逻辑和设计是否合理
- 检查是否有潜在的 bug 或安全问题
- 确保代码符合团队规范
- 提供建设性的反馈意见
- 及时响应,不要让 PR 长时间挂起
常见问题处理#
1. PR 与主分支冲突
# 更新主分支
git checkout main
git pull origin main
# 切回功能分支并 rebase
git checkout feature/my-feature
git rebase main
# 解决冲突后继续
git add .
git rebase --continue
# 强制推送(因为改变了提交历史)
git push origin feature/my-feature --force
2. 需要修改已提交的 PR
直接在原分支上继续提交即可,GitHub 会自动更新 PR:
git add .
git commit -m "fix: address review comments"
git push origin feature/my-feature
3. PR 被合并后的清理
# 删除本地分支
git branch -d feature/my-feature
# 删除远程分支
git push origin --delete feature/my-feature
# 更新本地主分支
git checkout main
git pull origin main
GitHub 项目规范#
必备文件#
一个规范的 GitHub 项目应该包含以下文件:
1. README.md
这是项目的门面,README 文件不仅要简洁明了地说明项目的目的和功能,还应包含安装指南、使用方式、贡献指南、许可信息。
基本结构:
# 项目名称
简短的项目描述
## 功能特性
- 特性 1
- 特性 2
## 快速开始
### 环境要求
- Node.js >= 14
- npm >= 6
### 安装
npm install
### 使用
npm start
## 文档
详细文档请查看 [文档目录](./docs)
## 贡献指南
请查看 [CONTRIBUTING.md](./CONTRIBUTING.md)
## 许可证
[MIT](./LICENSE)
2. .gitignore
每个存储库中都必须使用 .gitignore 文件来忽略预定义的文件和目录。
建议使用 gitignore.io 生成针对你的技术栈的 .gitignore 文件。
3. LICENSE
选择合适的开源许可证:
- MIT - 最宽松,允许商业使用
- Apache 2.0 - 提供专利保护
- GPL - 要求衍生作品也开源
- BSD - 类似 MIT, 但有一些限制
4. CONTRIBUTING.md
说明如何为项目做贡献:
- 如何提交 Issue
- 如何提交 Pull Request
- 代码规范要求
- 开发环境搭建
- 测试要求
5. CHANGELOG.md
记录项目的版本变更历史:
# Changelog
## [1.2.0] - 2024-12-06
### Added
- 新增用户头像上传功能
### Fixed
- 修复登录页面样式问题
### Changed
- 优化数据库查询性能
## [1.1.0] - 2024-11-15
...
其他最佳实践#
1. 保护主分支
主分支中的任何内容都应该是可部署的,所以不应该直接在默认分支上提交代码。
在 GitHub 仓库设置中:
- Settings → Branches → Branch protection rules
- 添加规则保护 main 分支
- 要求 PR review 后才能合并
- 要求 CI 检查通过
- 禁止强制推送
2. 使用 Issue 模板
创建 .github/ISSUE_TEMPLATE 目录,添加不同类型的 Issue 模板:
- bug_report.md - Bug 报告模板
- feature_request.md - 功能请求模板
3. 配置 Code Owners
使用 codeowners 功能可以定义哪些团队和人员被自动选为存储库的 reviewer。
创建 .github/CODEOWNERS 文件:
# 默认所有人
* @team-lead
# 前端代码
/src/frontend/ @frontend-team
# 后端代码
/src/backend/ @backend-team
# 文档
/docs/ @doc-team
4. 归档不再维护的仓库
对于不再积极开发的存储库,最佳实践是归档这些存储库,设置为只读模式。
在仓库设置中选择 "Archive this repository"。
5. 避免提交敏感信息
千万不要将任何 secret 提交到代码中。可以使用从安全存储外部注入的环境变量。
使用环境变量或配置文件管理敏感信息:
- 数据库密码
- API 密钥
- 私有令牌
- SSH 密钥
常见问题与解决方案#
提交了错误的 Commit 怎么办?#
修改最近一次提交:
# 修改提交信息
git commit --amend -m "新的提交信息"
# 添加遗漏的文件
git add forgotten_file
git commit --amend --no-edit
撤销已推送的提交:
- 公共分支优先用 git revert,reset --hard + --force 仅用于个人分支或极特殊场景。
# 软重置(保留改动)
git reset --soft HEAD~1
git push origin branch-name --force
# 硬重置(丢弃改动)
# ⚠ 仅限你自己控制的特性分支,不要对共享的 main / develop 这样做
git reset --hard HEAD~1
git push origin branch-name --force
如何合并多个 Commit?#
使用交互式 rebase:
# 合并最近 3 个 commit
git rebase -i HEAD~3
# 在编辑器中,将要合并的 commit 前的 pick 改为 squash(或 s)
# 保存退出后,编辑合并后的 commit message
分支冲突如何解决?#
# 1. 更新主分支
git checkout main
git pull origin main
# 2. 回到功能分支
git checkout feature-branch
# 3. 合并或 rebase
git merge main
# 或者
git rebase main
# 4. 解决冲突
# 编辑冲突文件,删除冲突标记
# 5. 标记为已解决
git add .
# 6. 继续合并或 rebase
git merge --continue
# 或者
git rebase --continue
# 7. 推送
git push origin feature-branch --force-with-lease
如何配置 Git 用户信息?#
确保你的 Git 客户端配置了正确的电子邮件地址并链接到了你的 GitHub 用户。
# 全局配置
git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"
# 仅当前项目配置
git config user.name "你的名字"
git config user.email "你的邮箱@example.com"
# 查看配置
git config --list
写在最后#
GitHub 使用规范看似繁琐,但实际上是保证项目质量和团队协作效率的重要基础。从我的经验来看,一个团队是否有清晰的 Git 规范,直接体现在项目的可维护性上。
刚开始推行这些规范时,可能会觉得增加了工作量,但当你习惯之后,会发现这些规范大大减少了后期维护成本。尤其是当你需要回溯某个 bug 的引入时间,或者需要快速了解某个功能的实现逻辑时,规范的 Commit Message 和清晰的分支历史会让你事半功倍。
我的建议是:
- 从小处着手 - 先从规范 Commit Message 开始,逐步引入其他规范
- 工具辅助 - 使用 Commitizen、Commitlint 等工具自动化检查
- 团队共识 - 规范要全员认同,而不是强制推行
- 持续优化 - 根据团队实际情况调整规范,不必完全照搬
- 以身作则 - 作为 Leader 或老成员,要率先遵守规范
记住,规范的目的是提升效率,而不是制造障碍。选择适合自己团队的规范,并坚持执行,你会看到代码质量和协作效率的显著提升。
如果你在实践中遇到问题,或者有更好的实践经验,欢迎在评论区交流讨论。
相关链接#
- Angular Commit Message 规范
- Conventional Commits 规范
- Git Flow 原文
- GitHub Flow 介绍
- GitHub 官方文档
- Pro Git 中文版
- Commitizen 工具
- Commitlint 工具
此文由 Mix Space 同步更新至 xLog
原始链接为 https://blog.astrasolis.top/posts/tutorial/github-standard