php项目成功使用版本控制的关键在于支撑协作、回滚、发布和问题定位:vendor/和.env必须排除,composer.lock必须提交,采用main/develop/feature分支流,commit需关联具体问题并含语义化tag。

PHP 项目算不算成功用了版本控制,不看有没有 git init,而看它是否真正支撑了协作、回滚、发布和问题定位——换句话说,.gitignore 里有没有漏掉 vendor/,composer.lock 提交没提交,分支策略能不能让 dev 和 prod 环境互不干扰,才是关键。
PHP 项目里哪些文件绝不能进 Git
PHP 生态依赖管理(Composer)和运行时环境(如 .env)决定了部分文件必须排除,否则轻则冲突,重则泄露密钥或导致部署失败:
-
vendor/:永远不提交。CI/CD 流程应通过composer install --no-dev重建,避免二进制差异和体积膨胀 -
.env:本地配置文件,含数据库密码、API key 等,必须进.gitignore;用.env.example提供结构模板 -
composer.lock:必须提交。它锁定依赖版本,确保composer install在所有环境还原完全一致的依赖树 -
storage/logs/、storage/framework/(laravel)、cache/等运行时生成目录:属于状态,非代码,禁止纳入版本控制
分支模型得匹配 PHP 部署节奏
PHP 项目常以“上传即上线”方式部署(如共享主机、简单 VPS),若分支混乱,很容易把未测代码推到生产:
- 主干必须是
main或master,且只接受经测试、带 tag 的合并 —— 不允许直接 push 到主干 - 推荐最小可行分支流:
main(对应线上)、develop(集成测试)、feature/*(短期开发);避免长期存在的dev分支变成“第二个 main” - 每次上线前打语义化 tag(如
v2.1.0),而非仅靠分支名判断版本。Git tag 是 PHP 部署脚本(如 rsync + hook)识别发布的唯一可靠依据
commit 信息要能回答“为什么改这个 PHP 文件”
PHP 错误往往在运行时暴露,靠 git blame 追溯时,空泛的 fix bug 没用:
立即学习“PHP免费学习笔记(深入)”;
- 每条 commit 必须关联具体问题:比如
fix: prevent DivisionByZeroError in OrderCalculator::total(),而不是update calc.php - 涉及安全修复(如 sql 注入补丁)或兼容性变更(如废弃
mysql_connect()),commit 信息需明确标注影响范围 - 如果团队用 issue 跟踪,commit 中写
refs #123或closes #456,让 Git 和 issue 系统联动,方便回溯上下文
CI/CD 脚本里是否真正验证了 PHP 行为
只跑 php -l(语法检查)或 composer validate 不算成功集成。PHP 版本控制的价值,在于每次提交都能触发真实反馈:
- 必须检查 PHP 版本兼容性:在 CI 中用
php --version和composer show php核对composer.json中的php约束是否被满足 - 单元测试(如 PHPUnit)需覆盖核心业务逻辑,且 CI 中启用
--fail-on-warning,避免因@deprecated警告掩盖实际风险 - 部署前执行
composer install --no-dev --optimize-autoloader,并验证autoload_classmap.php是否生成成功——这是很多 Laravel/ symfony 项目上线后类找不到的根源
真正成功的 PHP 版本控制,是开发者删掉本地 vendor/、换台机器重拉代码、跑完 composer install 就能直接 php artisan serve 或 php index.php 启动,且日志里没有因路径、扩展缺失或版本错位引发的警告。其余都是锦上添花。