如何获取当前 Git 分支名

获取当前分支名:git branch --show-current(Git 2.22+,最简洁);兼容性更好的是 git rev-parse --abbrev-ref HEAD。脚本中推荐使用这两个,不要解析 git branch 的输出。

最佳实践
Git 分支协作与合并示意

Git 2.22 起:git branch --show-current,专为这个需求设计,输出干净的分支名。 更老版本用 git rev-parse --abbrev-ref HEAD,但要求 HEAD 可解析且需检查退出状态。两者都适合脚本;不要再用 git branch | grep '*' 解析的方式。

命令对比

git branch --show-current        # 输出: main(Git 2.22+,推荐)
git rev-parse --abbrev-ref HEAD  # 输出: main(要求 HEAD 可解析)
git symbolic-ref --short HEAD    # 输出: main(游离 HEAD 时报错)

在脚本中使用

#!/bin/bash
branch=$(git rev-parse --abbrev-ref HEAD) || exit 1
if [ "$branch" = "main" ]; then
  echo "禁止直接在 main 上操作"
  exit 1
fi

pre-push 若要保护远端分支,应检查钩子 stdin 中实际目标引用,当前检出分支不能代表 push 目标。

常见于:本地操作提示、CI 脚本按分支名决定部署环境、命令行提示符(PS1)显示分支。

游离 HEAD 状态的表现

检出 tag 或提交哈希后处于 detached HEAD:

  • git branch --show-current → 输出空;
  • git rev-parse --abbrev-ref HEAD → 输出 HEAD。

脚本里要注意判空,否则会拿到意外值。

常见问题(FAQ)

Q:为什么不推荐 git branch | grep '*'?

git branch 的输出是给人看的(带颜色、星号、可能分页),格式在不同版本/配置下会变;脚本解析它很脆弱。--show-current 和 rev-parse 是稳定的"管道友好"接口。

Q:能拿到完整引用名(refs/heads/main)吗?

git symbolic-ref HEAD 输出 refs/heads/main,--short 参数去掉前缀。

Q:CI 里获取不到分支名?

很多 CI 检出的是具体提交(detached HEAD),它们会按上述方式返回空或 HEAD。应按 CI 事件类型使用平台环境变量(GitHub Actions 的 GITHUB_REF_NAME、GitLab 的 CI_COMMIT_REF_NAME);这些值也可能表示 tag 或 PR 合并引用,PR 源分支需查对应事件字段。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台