git本身不提供分支自动加载配置的能力,所有“按分支切换配置”方案本质是人工约定+外部工具驱动;推荐各环境分支只保留对应application-{profile}.yml文件并明确设置spring.profiles.active,禁止跨分支混存配置或依赖includeif等git客户端机制实现环境隔离。

Git 本身不提供“分支自动加载不同配置”的能力,所有所谓“按分支切换配置”的方案,本质都是靠人工约定 + 外部工具或脚本驱动。直接把 application-prod.yml 提交到 prod 分支、把 application-dev.yml 提交到 dev 分支,是最简单也最不容易出错的起点。
不同分支各自维护独立的配置文件
这是 RuoYi、Spring Boot 等框架默认支持且最推荐的方式。每个环境分支只保留自己那一份完整的配置文件,其他环境的配置文件在该分支上根本不存在(或被 .gitignore 排除)。
- 开发时:切到
dev分支,application.yml中spring.profiles.active: dev,同时仓库里只有application-dev.yml; - 测试时:合并到
test分支,该分支里只保留application-test.yml,并确保application.yml指向test; - 上线前:从
test合并到prod分支,该分支中只存在application-prod.yml,且spring.profiles.active明确设为prod。
关键点在于:不要试图让一个分支“同时持有多个环境配置”,也不要依赖运行时动态读取远端分支的配置——这会让部署逻辑耦合 Git 操作,CI/CD 流水线难以稳定。
用 git diff 安全比对分支间配置差异
当需要确认两个环境配置是否真正一致(比如 prod 和 uat 的数据库地址是否仅差一个字符),git diff 是唯一可信的检查手段。但常见错误是直接跑 git diff develop prod,结果为空或报错。
- 先确保工作区干净:
git status输出应为空,否则未暂存修改会干扰比对; - 明确比较目标:用
git diff develop...prod -- application-prod.yml(三个点),Git 会自动找共同祖先,避免因合并方向导致误判; - 聚焦关键路径:加
--name-only快速确认哪些配置文件有差异,再针对具体文件细看; - 注意
--分隔符:漏掉它,Git 可能把文件名误认为分支名,例如git diff main -- src/main/resources/application.yml才正确。
别信 IDE 的“文件对比”插件——它只比对当前检出内容,看不到分支快照间的实际变更历史。
禁止在 Git 配置中用 includeIf 做环境隔离
虽然 Git 支持 [includeIf "gitdir:xxx/"] 加载不同 .gitconfig,但它只影响 Git 自身行为(如 user.name、core.editor),**完全不作用于项目代码或配置文件内容**。把它当成“让 dev 分支自动读 application-dev.yml”的方案,属于典型误解。
- 这种写法只能改本地 Git 客户端行为,对构建脚本、CI runner、Docker 容器内启动的应用零影响;
- 一旦团队成员没配好自己的
.gitconfig,或者 CI 使用的是干净容器,整个“环境感知”就彻底失效; - 更危险的是:它把环境决策从代码/部署层,偷偷移到了开发者个人机器上,违反“可重现构建”原则。
真正的环境隔离必须发生在构建或部署阶段,而不是靠每个开发者手动维护一份分支敏感的 Git 配置。
CI/CD 中配置注入比分支切换更可靠
在 Jenkins、GitLab CI 或 GitHub Actions 里,与其让流水线先 git checkout prod 再启动应用,不如统一检出 main 分支,然后根据触发流水线的分支名或手动指定的变量,动态注入配置。
- 例如 GitLab CI 中:
if: $CI_COMMIT_BRANCH == "prod",则把prod-secrets.yaml挂载进容器,或用envsubst替换模板中的${DB_HOST}; - Spring Boot 用户可配合
spring.config.import=optional:file:./config/app-${ENV}.yml,由部署脚本传入ENV=prod; - 所有敏感值(密码、密钥)绝不提交进 Git,哪怕是在
prod分支里——它们应该来自 CI 的 secret 变量或 Vault。
分支只是代码演进的轨迹,不是环境的容器。把环境语义强绑定到分支上,会在灰度发布、热修复、多版本并行运维时迅速失控。











