如何获取当前 Git 分支名
获取当前分支名:git branch --show-current(Git 2.22+,最简洁);兼容性更好的是 git rev-parse --abbrev-ref HEAD。脚本中推荐使用这两个,不要解析 git branch 的输出。
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 源分支需查对应事件字段。