如何获取当前 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,兼容性最好。两者都适合脚本;不要再用 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)。