Git工作流最佳实践
Git已经成为现代软件开发的标配工具,但会用Git和用好Git是两回事。在团队协作中,不规范的使用方式会导致代码混乱、冲突频发、回退困难等问题。在这篇文章中,我将分享Git工作流的最佳实践,帮助你建立高效的团队协作模式。
分支策略
GitHub Flow
最简单的工作流,适合持续部署的项目:
- main:主分支,始终保持可部署状态
- feature/*:功能分支,完成后合并到main
# 创建功能分支
git checkout -b feature/new-login
# 开发并提交
git add .
git commit -m "feat: add new login page"
# 推送到远程
git push origin feature/new-login
# 创建Pull Request,代码审查后合并
Git Flow
更结构化的工作流,适合有明确发布周期的项目:
- main:生产环境代码
- develop:开发主分支
- feature/*:功能分支,从develop分出
- release/*:发布准备分支
- hotfix/*:紧急修复分支
# 功能开发
git checkout develop
git checkout -b feature/user-profile
# 开发完成后
git checkout develop
git merge feature/user-profile
# 准备发布
git checkout -b release/1.0.0
# 修复bug、更新版本号
git checkout main
git merge release/1.0.0
git tag -a v1.0.0
# 紧急修复
git checkout -b hotfix/critical-bug main
# 修复后
git checkout main
git merge hotfix/critical-bug
git checkout develop
git merge hotfix/critical-bug
Trunk Based Development
所有开发都在主干进行,使用功能开关控制发布:
# 直接在main上开发,或使用短期分支
git checkout main
git pull
git checkout -b short-lived-feature
# 快速完成并合并(通常1-2天)
git push origin short-lived-feature
# 创建PR并合并
提交规范
Conventional Commits
使用规范化的提交信息格式:
<type>(<scope>): <subject>
<body>
<footer>
类型(type)
- feat:新功能
- fix:修复bug
- docs:文档变更
- style:代码格式(不影响功能)
- refactor:重构
- test:测试相关
- chore:构建或辅助工具变动
- perf:性能优化
feat(auth): add OAuth2 login support
Implement OAuth2 authentication flow with Google and GitHub providers.
Users can now login using their social accounts.
Closes #123
fix(cart): correct total calculation with discounts
The discount was being applied after tax, causing incorrect totals.
Now applies discount before tax calculation.
fixes #456
提交最佳实践
- 一个提交一个变更:每个提交只做一件事
- 提交信息要清晰:说明"做了什么"和"为什么"
- 使用祈使语气:"add feature" 而非 "added feature"
- 引用相关Issue:便于追踪
代码审查
Pull Request规范
一个好的PR描述应该包含:
## 变更说明
简要描述本次变更的目的和内容
## 变更类型
- [ ] 新功能
- [ ] Bug修复
- [ ] 重构
- [ ] 文档更新
## 测试情况
描述如何测试这些变更
## 截图
如果有UI变更,附上截图
## 检查清单
- [ ] 代码遵循项目规范
- [ ] 已添加测试
- [ ] 文档已更新
- [ ] 无新的警告
审查要点
- 代码正确性:逻辑是否正确,边界条件是否处理
- 代码质量:可读性、可维护性、性能
- 测试覆盖:是否有足够的测试
- 安全考虑:是否有安全风险
冲突解决
预防冲突
- 保持分支更新,定期rebase或merge主分支
- 小步快跑,频繁合并
- 团队成员间保持沟通
- 合理拆分模块,减少交叉修改
解决冲突
# 更新主分支
git checkout main
git pull origin main
# 回到功能分支并rebase
git checkout feature/my-feature
git rebase main
# 如果有冲突,解决冲突
# 编辑冲突文件...
# 标记已解决
git add resolved-file.js
git rebase --continue
# 强制推送(因为历史已改变)
git push origin feature/my-feature --force
实用命令
暂存工作
# 暂存当前工作
git stash
# 带描述的暂存
git stash save "WIP: login feature"
# 查看暂存列表
git stash list
# 恢复暂存
git stash pop
# 恢复特定暂存
git stash apply stash@{0}
撤销操作
# 撤销工作区的修改
git checkout -- file.js
# 撤销暂存
git reset HEAD file.js
# 修改最后一次提交
git commit --amend
# 撤销提交(保留修改)
git reset --soft HEAD~1
# 撤销提交(丢弃修改)
git reset --hard HEAD~1
# 创建撤销提交
git revert commit-hash
查看历史
# 图形化历史
git log --oneline --graph --all
# 查看特定文件的历史
git log -p file.js
# 查看谁修改了某行
git blame file.js
# 搜索提交信息
git log --grep="关键词"
工具推荐
- commitlint:提交信息格式检查
- husky:Git hooks管理
- lint-staged:只检查暂存文件
- git-cz:交互式提交信息生成
- semantic-release:自动化版本发布
总结
良好的Git工作流是团队协作效率的基石。选择适合团队的分支策略,坚持提交规范,认真对待代码审查,这些习惯会让协作更加顺畅。
记住,工具和规范服务于效率,不要为了规范而规范。根据团队规模、项目特点灵活调整,找到最适合你们的工作方式。