如何在PR直接合并到master后,触发向develop的反向PR以保持分支同步?
从master反向同步到develop分支的解决方案
Bitbucket 方案
手动创建反向PR
如果已经有变更直接合并到master,最快的处理方式是手动在Bitbucket界面创建反向同步PR:
- 打开仓库的Pull requests页面,点击「Create pull request」
- 源分支选择
master,目标分支选择develop - 给PR设置清晰的标题(比如「补同步:master直接合并的变更到develop」),描述里说明是补做跳过develop环节的同步操作
- 提交PR后,处理可能出现的代码冲突,确认无误后合并到develop
自动触发反向PR(用Bitbucket Pipelines)
如果想实现自动检测并创建同步PR,可以用Bitbucket Pipelines配置自动化流程:
在仓库根目录新建bitbucket-pipelines.yml文件,内容如下:
pipelines: branches: master: - step: name: 自动同步master到develop image: atlassian/default-image:3 script: - git config user.name "Bitbucket Pipeline Bot" - git config user.email "pipeline@bitbucket.org" # 拉取全部分支的最新代码 - git fetch --all # 切换到develop分支并拉取最新版本 - git checkout develop && git pull origin develop # 尝试合并master的变更,有冲突则终止流程(需手动处理) - git merge origin/master --no-ff --no-edit || exit 1 # 创建带时间戳的同步分支 - SYNC_BRANCH="sync-master-to-develop-$(date +%Y%m%d%H%M%S)" - git checkout -b $SYNC_BRANCH # 推送同步分支到远程 - git push origin $SYNC_BRANCH # 调用Bitbucket API创建PR - curl -X POST -u $BITBUCKET_USER:$BITBUCKET_APP_PASS https://api.bitbucket.org/2.0/repositories/${BITBUCKET_REPO_OWNER}/${BITBUCKET_REPO_SLUG}/pullrequests \ -H "Content-Type: application/json" \ -d '{ "title": "自动同步master变更到develop", "source": {"branch": {"name": "'$SYNC_BRANCH'"}}, "destination": {"branch": {"name": "develop"}}, "description": "自动创建的同步PR:补充直接合并到master但未经过develop的变更" }'
配置说明:
- 需要在仓库的「Repository settings > Pipelines > Repository variables」里添加
BITBUCKET_USER(你的Bitbucket用户名)和BITBUCKET_APP_PASS(提前创建的App Password,需授予PR和仓库读写权限) - 如果合并时出现冲突,Pipeline会失败,需要手动解决冲突后再创建PR
Jenkins 方案
自动检测并创建反向PR
用Jenkins实现自动化同步的步骤:
- 新建Jenkins自由风格项目,触发条件选择「Bitbucket hook trigger for GITScm polling」,确保master分支有推送时自动触发构建
- 配置源码管理,拉取仓库的全部分支,勾选「Advanced」里的「Refspec」填写
+refs/heads/*:refs/remotes/origin/* - 添加「Execute shell」构建步骤,执行以下脚本:
#!/bin/bash # 配置Git提交身份 git config user.name "Jenkins同步机器人" git config user.email "jenkins@your-domain.com" # 拉取最新代码 git fetch origin git checkout develop git pull origin develop # 检查master是否有develop未同步的提交 UNSYNCED_COMMITS=$(git log develop..origin/master --oneline) if [ -n "$UNSYNCED_COMMITS" ]; then # 创建带时间戳的同步分支 SYNC_BRANCH="sync-master-to-develop-$(date +%Y%m%d%H%M%S)" git checkout -b $SYNC_BRANCH # 合并master的变更 git merge origin/master --no-ff --no-edit # 推送到远程仓库 git push origin $SYNC_BRANCH # 调用Bitbucket API创建PR curl -X POST -u $BITBUCKET_USER:$BITBUCKET_PASS https://api.bitbucket.org/2.0/repositories/你的仓库所有者/仓库名/pullrequests \ -H "Content-Type: application/json" \ -d '{ "title": "[Jenkins自动同步] master到develop", "source": {"branch": {"name": "'$SYNC_BRANCH'"}}, "destination": {"branch": {"name": "develop"}}, "description": "自动创建的同步PR,补同步直接合并到master的变更\n未同步提交列表:\n'$UNSYNCED_COMMITS'" }' fi
- 在Jenkins全局凭据中添加Bitbucket的用户名和App Password,在构建步骤中引用为环境变量
BITBUCKET_USER和BITBUCKET_PASS - 保存项目后,当有变更直接合并到master时,Jenkins会自动检测并创建同步PR到develop
额外预防建议
为了从源头避免这类问题,可以在Bitbucket仓库设置分支权限:
- 对
master分支开启「合并检查」,要求PR必须从develop分支发起 - 启用「需要至少一个审批」的规则,禁止无审核直接合并到master
内容的提问来源于stack exchange,提问作者Mukherjee47
相关产品推荐
相关产品推荐

