4、版本控制:Git与GitHub的配置、分支策略、代码提交规范
版本控制这件事,说白了就是给项目装一台“时光机”。
我刚入行那会儿,团队还在用 FTP 传代码,文件名后面带日期是常态。后来有一次上线前发现改错了,想回退?没门。那之后我就彻底倒向了 Git。今天这章,我把这几年在 Git 和 GitHub 上踩过的坑、总结出的好习惯,一次性说清楚。
4.1 Git 基础配置:别让工具拖后腿
装好 Git 之后,第一件事不是 clone 仓库,而是配好身份信息。我见过太多人跳过这步,结果提交记录里显示的是“unknown”。
git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"
嗯,这里要注意:邮箱最好和 GitHub 注册邮箱一致,不然你的 commit 不会关联到 GitHub 头像。
我个人习惯还会配几个别名,省时间:
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.lg "log --oneline --graph --all --decorate"
git lg 看提交历史,比默认的 log 清晰十倍。分支、合并、分叉一目了然。
4.2 GitHub 配置:SSH 密钥与远程仓库
配好本地 Git 之后,下一步就是连 GitHub。我个人强烈推荐用 SSH 方式,而不是 HTTPS。为什么?因为不用每次 push 都输密码。
生成密钥很简单:
ssh-keygen -t ed25519 -C "你的邮箱@example.com"
一路回车,然后在 ~/.ssh/id_ed25519.pub 里拿到公钥,粘贴到 GitHub 的 Settings → SSH and GPG keys 里。
我曾经有一次因为换了电脑,忘了配 SSH,结果 push 的时候一直报权限错误。排查了半天才发现是公钥没加。嗯,从那以后我每次换设备第一件事就是配 SSH。
验证是否成功:
ssh -T git@github.com
# 输出:Hi xxx! You've successfully authenticated...
4.3 分支策略:选对模型,少走弯路
分支策略这东西,没有银弹。但如果你问我,小团队用什么最省心?我会说:GitHub Flow。
它的核心规则就几条:
main分支永远是可部署的- 新功能从
main拉出特性分支 - 开发完成后提 Pull Request
- Code Review 通过后合并回
main - 合并后立即部署
你想想看,这套流程简单到几乎没有学习成本。我在一个 10 人团队里用了两年,从来没出过问题。
但如果是大项目、多版本并行,那就得用 Git Flow 了。它多了 develop、release、hotfix 分支,结构更重,但控制力更强。
| 分支模型 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| GitHub Flow | 小团队、持续部署 | 简单、快速 | 多版本并行时混乱 |
| Git Flow | 大项目、版本发布 | 结构清晰、控制力强 | 分支多、操作繁琐 |
| Trunk-Based | CI/CD 成熟团队 | 极简、冲突少 | 对测试要求极高 |
下面这张图,把三种分支模型的核心流程画出来了:
4.4 代码提交规范:让历史可读
提交信息写得好不好,直接决定你三个月后能不能看懂自己在干什么。
我推荐用 Conventional Commits 规范。格式很简单:
<类型>: <简短描述>
[可选正文]
[可选脚注]
类型用这几个就够了:
feat— 新功能fix— 修复 bugdocs— 文档变更refactor— 重构test— 测试相关chore— 杂项(构建、依赖等)
举个例子:
feat: 添加用户登录接口
实现基于 JWT 的登录认证,包含 token 刷新逻辑。
Closes #42
我曾经在一个项目里看到过这样的提交信息:“fix bug”、“update”、“改了点东西”。你想想看,这种信息跟没写有什么区别?后来我强制团队用规范,配合 commitlint 做自动化检查,才彻底改掉这个毛病。
4.5 避坑指南:我踩过的那些坑
最后分享几个实战中容易翻车的地方:
- 不要直接往 main 分支 push。 我曾经有一次手快,把未测试的代码直接 push 到了 main,结果 CI 全红,同事追着我问了一下午。从那以后我养成了习惯:main 分支加保护,必须走 PR。
- 合并前先 rebase。 我个人习惯在合并 PR 之前,先把特性分支 rebase 到最新的 main 上,这样历史是一条直线,看着清爽。
- .gitignore 要提前配好。 我见过有人把
node_modules和.env都提交上去了。嗯,这很尴尬。建议一开始就配好模板。 - 提交前先 diff。 用
git diff --staged看一眼,确认没有遗留的调试代码或敏感信息。
husky + lint-staged 在提交前自动检查代码格式和规范。省心省力。
版本控制这件事,说到底是为了让团队协作更顺畅,让历史可追溯。工具是死的,习惯是活的。把基础配好、策略选对、规范定死,剩下的就是坚持执行。