GitHub仓库如何实现Nightly Branch Merging夜间自动合并指定分支
完全可以实现,不需要额外部署服务器,直接用GitHub Actions就能完成整套定时自动合并流程,逻辑和你手动按优先级合并分支的操作完全一致。
实现逻辑
核心是利用GitHub原生的定时工作流能力,按预设的分支上线优先级队列,在指定的夜间非工作时段依次执行向下合并:合并无冲突则自动推送到远程分支,遇到冲突自动终止当前合并步骤、创建带专属标记的PR提醒人工处理,常规场景全程不需要人工介入。
具体配置步骤
- 先梳理当前所有待上线分支的优先级,严格按照「最早生产上线分支→次早上线分支→…→develop分支」的顺序整理成队列。
- 在仓库内创建工作流文件,路径为
.github/workflows/nightly-branch-merge.yml,写入以下基础配置:
name: Nightly Branch Auto Merge on: schedule: # 北京时间每日凌晨2点执行,基于UTC时区换算,可根据团队作息调整 - cron: '0 18 * * *' # 支持手动触发测试 workflow_dispatch: permissions: contents: write pull-requests: write jobs: auto-merge: runs-on: ubuntu-latest steps: - name: 拉取仓库代码 uses: actions/checkout@v4 with: fetch-depth: 0 # 拉取全部分支与提交记录 - name: 配置Git身份 run: | git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" - name: 按优先级执行合并 env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | # 按上线优先级从先到后排列分支,最后一个为最终合并目标develop BRANCH_QUEUE=("release/20240615" "release/20240625" "release/20240705" "develop") MERGE_STRATEGY="--no-ff" # 保留合并提交轨迹,可根据团队规范调整为对应参数 for ((i=0; i<${#BRANCH_QUEUE[@]}-1; i++)); do SOURCE_BRANCH=${BRANCH_QUEUE[$i]} TARGET_BRANCH=${BRANCH_QUEUE[$i+1]} echo "处理合并: $SOURCE_BRANCH -> $TARGET_BRANCH" # 跳过不存在的分支 if ! git rev-parse --verify "origin/$SOURCE_BRANCH" >/dev/null 2>&1; then echo "源分支 $SOURCE_BRANCH 不存在,跳过" continue fi if ! git rev-parse --verify "origin/$TARGET_BRANCH" >/dev/null 2>&1; then echo "目标分支 $TARGET_BRANCH 不存在,跳过" continue fi # 拉取分支最新代码 git checkout $TARGET_BRANCH git pull origin $TARGET_BRANCH git pull origin $SOURCE_BRANCH # 两个分支无提交差异则直接跳过 if git merge-base --is-ancestor $SOURCE_BRANCH $TARGET_BRANCH; then echo "$TARGET_BRANCH 已包含 $SOURCE_BRANCH 的所有提交,跳过合并" continue fi # 尝试自动合并 if git merge $MERGE_STRATEGY $SOURCE_BRANCH -m "🔖 夜间自动合并: $SOURCE_BRANCH -> $TARGET_BRANCH"; then echo "合并成功,推送到远程" git push origin $TARGET_BRANCH else echo "检测到合并冲突,终止合并并创建冲突处理PR" git merge --abort gh pr create \ --base "$TARGET_BRANCH" \ --head "$SOURCE_BRANCH" \ --title "[夜间自动合并][需人工处理] 合并 $SOURCE_BRANCH 到 $TARGET_BRANCH 存在冲突" \ --body "定时自动合并检测到分支代码冲突,请相关开发人员手动解决冲突后完成合并。" \ --label "nightly-merge-conflict" fi done
- 将配置中
BRANCH_QUEUE的分支列表替换为你自己团队的分支优先级顺序,根据实际需求调整执行时间、合并策略即可。
注意事项
- 定时规则的cron表达式采用UTC时区,不要设置在日常开发高峰时段执行,避免合并过程中持续有代码提交导致的状态不一致问题。
- 首次配置完成后先使用工作流的手动触发功能多轮测试,确认合并顺序、无冲突自动合入、冲突自动建PR的逻辑都符合预期,再开启定时执行。
- 如果团队要求所有分支合并必须经过代码评审,可以把配置中合并成功直接push的逻辑修改为无冲突也自动创建PR,指定对应评审人审批后再合入。
- 建议给冲突类PR配置专属标签,配合仓库通知规则推送到团队协作群,避免冲突长时间未处理导致各环境分支代码不同步。
内容的提问来源于stack exchange,提问作者sscomaro
相关产品推荐
相关产品推荐

