GitHub Actions升级npm版本打标签遇分支误删及分支选择问题
问题分析与解决
一、develop分支被误删的原因及修复
你的Push Tag步骤使用了错误的Git推送命令:
git push origin ${{ steps.get_tag.outputs.TAG }}:develop
这个命令的语法是git push <远程仓库> <本地引用>:<远程引用>,你把标签对应的提交推送到了远程develop分支,相当于强制将远程develop分支重置为该标签指向的历史节点。如果该标签的提交早于当前develop的最新提交,远程develop分支的后续提交会被覆盖,视觉上就会呈现出分支被"删除"的效果。
修复操作:
- 移除冗余的打标签步骤:
npm version命令会自动根据升级后的版本号创建对应的Git标签,不需要再手动执行git tag命令,这一步属于重复操作。 - 修正推送标签的命令:推送标签的正确方式是直接推送标签名称,而非映射到分支:
git push origin ${{ steps.get_tag.outputs.TAG }}
或者更简洁的方式,直接推送所有新生成的标签:
git push origin --tags
- 补充推送版本更新的提交:
npm version不仅会创建标签,还会自动生成一个修改package.json等文件的版本更新提交,需要将这个提交推送到对应分支(注意:PR触发的工作流中推送代码需要确保Actions有对应权限)。
二、版本升级与标签创建的分支选择
优先选main分支的场景:
- 遵循Git Flow工作流:
main分支作为生产就绪分支,版本标签应该对应生产环境的发布版本,每次从develop合并到main后执行版本升级和打标签,能确保标签与生产代码完全一致。 - 强调版本稳定性:标签代表可发布的稳定版本,
main分支的代码经过充分测试,适合作为版本标记的基准。
可选develop分支的场景:
- 需要标记开发阶段版本:如果团队需要跟踪开发分支的迭代版本(比如内部测试版),可以在
develop分支打标签,但这类标签建议带上-beta/-rc等后缀,和正式版本区分开。 - 小型团队或简化工作流:如果团队没有严格的分支规范,直接在
develop分支迭代并打标签,适合快速迭代的小项目。
最佳实践建议:
如果项目遵循标准Git Flow,优先在main分支执行版本升级和打标签:
- 当
develop分支功能开发完成,合并到main分支时触发工作流。 - 在
main分支完成版本升级、打标签,并推送标签和版本提交。 develop分支仅用于日常开发,不打正式版本标签。
修正后的完整工作流代码
name: Prettier, Semantic Versioning, and Tagging on: pull_request: types: [opened, reopened, synchronize] branches: - develop jobs: update-version: runs-on: ubuntu-latest steps: - name: Checkout Repository uses: actions/checkout@v4 with: fetch-depth: 0 ref: ${{ github.head_ref }} - name: Set Git User Identity run: | git config --global user.email "${{ secrets.GIT_USER_EMAIL }}" git config --global user.name "${{ secrets.GIT_USER_NAME }}" - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: "20" - name: Pretty checking & auto formatting run: | echo "executing prettier commands." npm ci npm run prettier:check npm run prettier:format git add . git commit -m "chore: auto format code with prettier" || echo "No changes to commit" - name: Determine Version Increment Level id: determine-version-level run: | commit_message=$(git log --format=%B -n 1) echo "commit_message...: $commit_message" if [[ $commit_message == *"breaking changes:"* || $commit_message == *"breaking change:"* || $commit_message == *"BREAKING CHANGE:"* ]]; then echo "version-level=major" >> $GITHUB_OUTPUT elif [[ $commit_message == *"feat:"* || $commit_message == *"feature:"* ]]; then echo "version-level=minor" >> $GITHUB_OUTPUT else echo "version-level=patch" >> $GITHUB_OUTPUT fi - name: Update Version Numbers using npm run: | version_level=${{ steps.determine-version-level.outputs.version-level }} echo "Version Level...: $version_level" npm version $version_level --force - name: Push Version Commit and Tag run: | git push origin ${{ github.head_ref }} git push origin --tags
注意:在PR触发的工作流中推送代码到PR分支,需要确保GitHub Actions拥有仓库的读写权限(可在仓库设置的Actions权限中开启)。
内容的提问来源于stack exchange,提问作者Rocky
相关产品推荐
相关产品推荐

