You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 23:27:09