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

如何在GitHub Actions的push工作流中获取PR合并前最后一次提交SHA

GitHub Actions Push 工作流获取PR合并前末次提交SHA方案

实现逻辑

我们通过合并提交的特征做两步判断和取值,完全适配你给出的仅监听master分支push事件的配置:

  1. 识别当前push是否由PR合并触发,非合并场景直接终止后续流程
  2. 从PR合并生成的提交的父节点中提取PR内最后一次提交的SHA值

完整工作流配置

name: Get PR last commit SHA on master push
on:
  push:
    branches:
      - master

jobs:
  process-pr-merge:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          # 需拉取至少2条提交记录才能获取合并提交的父节点信息
          fetch-depth: 2

      - name: Judge whether the push is triggered by PR merge
        id: check_merge_trigger
        run: |
          CURRENT_COMMIT_MSG=$(git log --format=%B -n 1 ${{ github.sha }})
          # 匹配GitHub默认PR合并提交的信息前缀
          if [[ ! "$CURRENT_COMMIT_MSG" =~ ^Merge\ pull\ request\ \# ]]; then
            echo "skip_run=true" >> $GITHUB_ENV
            echo "Current push is not a PR merge event, all subsequent steps will be skipped."
            exit 0
          fi

      - name: Extract the last commit SHA in the PR
        if: ${{ !env.skip_run }}
        run: |
          # 合并提交的第二个父节点即为PR内的最后一次提交
          PR_LAST_COMMIT_SHA=$(git rev-parse ${{ github.sha }}^2)
          echo "PR_LAST_COMMIT_SHA=$PR_LAST_COMMIT_SHA" >> $GITHUB_ENV
          echo "The last commit SHA of the merged PR is: $PR_LAST_COMMIT_SHA"

      - name: Your custom business steps
        if: ${{ !env.skip_run }}
        run: |
          # 后续步骤可直接通过环境变量调用获取到的SHA
          echo "Running business logic with PR SHA: ${{ env.PR_LAST_COMMIT_SHA }}"

特殊场景说明

上述方案仅适用于PR合并采用默认创建合并提交模式的仓库,如果你使用其他合并模式需要调整逻辑:

  • 若使用Squash合并:合并后仅生成1个提交,无PR侧父节点,可从提交信息中提取PR编号后调用GitHub REST API获取PR末次提交SHA
  • 若使用Rebase合并:不会生成独立的合并提交,无法通过当前push事件的提交特征判断触发源,建议额外监听pull_request_target事件做对应逻辑处理

内容的提问来源于stack exchange,提问作者Gajus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:54:03