本规范旨在概述 Git 的使用最佳实践,以维护一个清晰、可理解且高效的版本控制历史。请在日常 Git 工作流程中遵循此指南。
清晰、一致的 Commit 消息是理解项目历史的关键。
- 使用空行分隔标题和正文。
- 限制标题长度在50个字符以内,以便在简短日志中完整显示。
- 标题首字母大写。
- 标题结尾不加句号。
- 在标题中使用祈使句 (例如, 使用
Add feature而不是Added feature)。 - 正文内容每行不超过72个字符,确保在各种Git工具中都易于阅读。
- 使用正文解释"是什么"和"为什么",而不是"怎么做"。代码本身已经展示了"怎么做"。
强烈推荐采用 Conventional Commits 规范,它能够生成结构化、易于人和机器阅读的提交消息。
格式:
<type>(<scope>): <description>
[optional body]
[optional footer(s)]
常用类型:
feat: 新增功能fix: 修复 bugdocs: 仅修改文档style: 代码格式修改 (不影响代码逻辑)refactor: 代码重构perf: 性能优化test: 新增或修改测试build: 影响构建系统或外部依赖的更改ci: CI/CD 配置文件和脚本的更改chore: 其他不修改src或test文件的更改revert: 撤销之前的提交
示例:
feat(auth): Add Google OAuth2 login functionality
Implement the full OAuth2 flow for Google authentication. This allows users to sign up and log in with their Google accounts, improving the user experience.
Closes #123
一致的分支策略可以防止仓库历史变得混乱。
使用清晰、描述性的命名约定,推荐使用类型前缀。
- 功能分支:
feat/user-authentication或feature/user-auth - 修复分支:
fix/login-button-bug - 杂项/重构:
chore/update-dependencies或refactor/api-service-layer
- 从主分支创建新分支 (
main或master)。git checkout main git pull origin main git checkout -b feat/new-shiny-feature
- 在功能分支上提交更改。
- 将分支推送到远程仓库。
git push -u origin feat/new-shiny-feature
- 创建 Pull Request (PR) 将功能分支合并到
main。 - 合并后删除分支。
- 保持分支的生命周期短暂。一旦准备就绪就尽快合并。
- 经常从
main拉取更新 到你的功能分支,以避免巨大的合并冲突。# 在你的功能分支上执行 git pull origin main --rebase - 删除已合并的分支 (本地和远程)。
# PR 合并后 git checkout main git pull git branch -d feat/new-shiny-feature git push origin --delete feat/new-shiny-feature
PR 是团队协作的基石。
- 创建小而专注的 PR:一个 PR 只解决一个问题。小 PR 更容易、更快速地被审查。
- 编写清晰的描述:使用 PR 模板解释你所做更改的"是什么"和"为什么"。对于UI更改,附上截图或GIF。
- 关联 Issue:如果 PR 解决了某个 Issue,请关联它 (例如, "Closes #123")。
- 要求代码审查:合并前至少需要一位其他成员审查并批准。
- 确保 CI 检查通过:所有自动化检查 (测试、代码风格检查) 必须通过。
合并 PR 的方式极大地影响项目历史的清晰度。
- 保护主分支:绝不直接向
main分支推送代码。所有更改必须通过 PR。 - 优先使用 Squash and Merge:这将功能分支上的所有提交压缩成一个干净的提交记录合并到
main分支。这使得历史记录易于阅读和回滚。 - 使用 Rebase and Merge:如果你希望保持一个完全线性的历史记录,可以使用此方法。它会将功能分支的提交"重放"到
main分支的顶部。 - 避免在
main上使用普通的 merge commit,因为它会产生"合并气泡",使历史记录变得混乱。
在推送和创建 PR 之前,使用交互式变基 (git rebase -i) 来清理你的本地提交历史。你可以将小的、"进行中"的提交压缩成更大、更有意义的提交。
# 整理最近的3个提交
git rebase -i HEAD~3- 善用
.gitignore:积极维护你的.gitignore文件,以防止将无关文件(如.env、构建产物、IDE配置文件)提交到仓库中。 - 避免提交大文件:不要提交大型二进制文件、数据库或编译后的代码。如果需要对大文件进行版本控制,请使用 Git LFS (Large File Storage)。
- 保持更新:使用
git pull --rebase代替git pull,以避免在更新本地分支时产生不必要的合并提交。 - 清理过时的远程引用:清理本地已删除的远程分支的引用。
git fetch --prune
- 有用的别名 (Aliases):将这些别名添加到你的
.gitconfig文件中,可以加快工作流程。[alias] st = status co = checkout br = branch lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
🎯 目标:建立高效、规范的代码协作流程