脚本需先同步test和dev分支,再执行非快进合并、冲突检测、构建及错误退出;关键在于用set -e或&&链式执行、检查git status--porcelain是否为空、构建命令加|| exit 1,确保任一环节失败即中止。

怎么用 Shell 脚本自动合并 test 分支到 dev 并触发构建
能,但必须明确:Git 本身不执行构建,脚本只是串起 git checkout、git merge、npm run build(或 mvn clean package 等)这些命令。关键不是“一键万能”,而是控制流程顺序和失败退出。
常见错误是脚本里没检查上一步是否成功,结果 merge 失败了还继续 build,或者没处理冲突导致卡住。实际运行时,只要任意命令返回非 0 状态,就该立即中止。
- 所有 Git 操作后加
&&链式执行,或用set -e开启严格模式 - 先
git checkout dev,再git pull origin dev,确保本地dev是最新状态 - 用
git merge --no-ff --no-edit test避免快进合并,保留分支拓扑;--no-edit防止编辑器弹出中断自动化 - 合并后立刻
git status检查是否干净(无 unmerged files),否则说明有冲突,不能继续
如何判断 merge 是否真正成功,而非假成功
git merge 返回 0 不代表没冲突——它只表示命令执行完毕。真冲突时,Git 会写入冲突标记(<<<<<< HEAD),但退出码仍是 0。所以不能只靠 exit code。
必须额外验证工作区状态:
- 检查
git status --porcelain输出是否为空:有内容说明存在 unmerged 或 untracked 文件 - 检查是否存在冲突标记:
grep -r "^[[:space:]]*>>>>>>" . --include="*.js" --include="*.ts" --include="*.java" --include="*.xml" 2>/dev/null | head -n1(按项目文件类型调整--include) - 更稳妥的做法:合并后跑一次
git diff --quiet,若返回非 0,说明有未提交变更(大概率是冲突)
本地构建命令怎么嵌入脚本才不踩坑
构建命令(如 npm run build、./gradlew build)依赖当前 shell 环境的 PATH 和项目上下文。直接写在脚本里容易因路径错乱失败。
- 脚本开头用
cd "$(dirname "$0")/.."切到项目根目录,避免相对路径失效 - 不要假设
node或java已全局可用:用npx tsc替代tsc,用./node_modules/.bin/eslint替代全局eslint - 构建失败时,
npm run build默认不会让脚本退出——需显式加|| exit 1,否则后续步骤仍会执行 - 建议加上超时保护:
timeout 300s npm run build || { echo "Build timeout or failed"; exit 1; }
为什么不能跳过 test 分支的 rebase 或更新
直接 git merge test 很危险:如果 test 分支落后于 dev,合并可能引入旧代码;如果 test 有未同步的远程提交,本地 merge 会丢失别人的新改动。
正确做法是先同步 test:
-
git checkout test && git pull origin test,确保本地test和远程一致 - 可选但推荐:在
test上git rebase dev,把test的变更基于最新dev重放,提前暴露集成问题 - rebase 后再切回
dev合并,比直接 merge 更可控
这个步骤常被省略,结果上线前才发现 test 分支里的 bug 其实早就在 dev 里修过了,却因为没 rebase 又重复引入。


















