如何获取当前 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,兼容性最好。两者都适合脚本;不要再用 git branch | grep '*' 解析的方式。

命令对比

git branch --show-current        # 输出: main(Git 2.22+,推荐)
git rev-parse --abbrev-ref HEAD  # 输出: main(全版本兼容)
git symbolic-ref --short HEAD    # 输出: main(游离 HEAD 时报错)

在脚本中使用

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

常见于:pre-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),这两个命令都会失效。改用 CI 平台提供的环境变量(GitHub Actions 的 GITHUB_REF_NAME、GitLab 的 CI_COMMIT_REF_NAME)。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台