本文目录导读:

在 Laravel 项目发布(或部署)时,强烈建议使用标签(Tag),而不是分支(Branch)。
以下是详细的分析和最佳实践:
核心区别
- 分支(Branch): 是一个移动的指针。
main或master分支会随着新的提交(commit)而移动,如果你基于main分支部署,下一次部署时,代码可能已经变了。 - 标签(Tag): 是一个不可变的快照,一旦创建,它就永久指向某个特定的提交,不会改变。
为什么推荐使用标签?
-
可追溯性与回滚:
- 利用标签: 你可以使用
v1.0.0、v2.1.3这类语义化版本号标记,当出现严重 Bug 需要紧急回滚时,只需要将代码库切回到上一个稳定标签,并重新部署即可。你确切地知道线上跑的是哪份代码。 - 分支问题: 如果你部署了
main分支,并发现有问题,你无法确定当前main分支的代码是否与线上环境一致,除非你立即记录下当时的 commit hash。
- 利用标签: 你可以使用
-
语义化版本控制(SemVer):
- 标签让你能够清晰地管理版本。
- 你可以很容易地告诉团队成员或客户:“修复了 Bug 的版本是 v2.1.4”,而基于分支,你只能说“最新的 main 分支”。
-
CI/CD 的稳定性:
- 许多 CI/CD 流程(如 GitHub Actions、GitLab CI、Deployer)都原生支持或推荐使用标签触发构建和部署。
- 在 GitHub Actions 中,可以这样配置触发条件:
on: push: tags: - 'v*' # 仅当推送版本标签时才部署 - 这防止了开发中的无关代码(如
git push测试)意外触发生产环境部署。
-
与 Composer 兼容:
- 如果你将 Laravel 项目开发为 Composer 包(或构建内部的私有包),Composer 默认使用标签来解析版本约束。
"require": {"my-company/laravel-core": "^2.1"}会查找v2.1.x的标签,分支虽然也可以,但不如标签稳定和标准。
什么时候可以使用分支?
虽然标签是首选,但有两个合理的例外情况使用分支:
-
持续部署(Continuous Deployment,CD)到预发布环境:
- 场景: 你有一个
develop分支或staging分支,每次推送代码到该分支,都自动部署到测试或预发布环境(如staging.example.com)。 - 原因: 你希望快速获得最新代码的反馈,且预发布环境不如生产环境要求严格。
- 注意: 即使这样,生产环境部署依然应该基于标签。
- 场景: 你有一个
-
很小的团队或单人项目:
- 场景: 只有你自己开发,并且你可以严格控制每次部署的 commit。
- 原因: 你能够确保
main分支的每一次部署都经过测试,且部署频率低。 - 风险: 一旦养成习惯,团队扩大或出过一次“误将半成品代码部署到线上”的事故后,就会后悔。
如何结合使用?
一个标准的工作流应该是:
- 日常开发: 在
develop或功能分支上工作。 - 合并验证: 代码合并到
main或master分支后,自动运行测试、静态分析等 CI 任务。 - 创建发布: 在 GitHub/GitLab 上创建一个 Release,这个过程会自动创建一个标签(如
v1.2.3)。 - 部署触发: 你的部署脚本(无论是用 Deployer、Envoyer、Ansible 还是 GitHub Actions)监听 新创建的标签。
- 部署生产: 部署工具将代码库切换到那个标签,然后执行
composer install、php artisan migrate等操作。
举个例子:使用 Deployer 的配置
如果你使用 Deployer 工具,典型的配置如下:
// deploy.php
// 1. 告诉 Deployer 从标签获取代码
set('repository', 'git@github.com:your-name/your-laravel-app.git');
// 2. 当你运行: dep deploy --tag=v1.2.3
// Deployer 会自动执行:
// git clone --depth 1 --branch v1.2.3 ...
// 你也可以在 CI 中自动获取最新标签
task('deploy:get_tag', function () {
$tag = run('git describe --tags --abbrev=0'); // 获取最新标签
set('tag', $tag);
});
| 场景 | 推荐方式 | 替代方式 | 原因 |
|---|---|---|---|
| 生产环境 | 标签(Tag) | 分支 | 版本可追溯,回滚安全,CI/CD 稳定 |
| 预生产/测试环境 | 分支(Branch) | 快速获得最新代码反馈 | |
| 版本发布(Release) | 标签(Tag) | 分支 | 语义化版本控制,标准化发布流程 |
| 紧急修复(Hotfix) | 标签(Tag) | 分支 | 创建补丁版本标签,不干扰主分支开发 |
对于 Laravel 生产环境发布,坚持使用标签(Tag),这是专业、可靠的工程实践。