如何获取Git中当前分支的名称?
当前回答
为什么不使用git-aware shell提示符,它会告诉您当前分支的名称?git状态也有帮助。
如何从contrib/执行git-prompt.sh(git版本2.3.0),如__git_ps1 helper函数中所定义:
首先,如果检测到正在进行的重基,则存在特殊情况。Git在rebase过程中使用未命名的分支(分离的HEAD)使其成为原子分支,原始分支保存在其他地方。如果.git/HEAD文件是一个符号链接(从git的古代历史来看,这种情况非常罕见),那么它将使用git符号ref HEAD 2>/dev/null否则,它将读取.git/HEAD文件。下一步取决于其内容:如果此文件不存在,则当前没有分支。如果存储库是空的,通常会发生这种情况。如果它以“ref:”前缀开头,那么.git/HEAD是symref(符号引用),并且我们处于正常分支。去掉前缀以获得全名,去掉refs/heads/以获得当前分支的短名称:b=“${head#ref:}”# ...b=${b#refs/heads/}如果它不是以“ref:”开头,那么它是分离的HEAD(匿名分支),直接指向某个提交。使用git描述。。。以人类可读的形式编写当前提交。
我希望这有帮助。
其他回答
如果您确实希望最后一个分支/标记也在分离的HEAD状态下检出。
git reflog HEAD | grep 'checkout:' | head -1 | rev | cut -d' ' -f1 | rev
使现代化如果你有而且不害怕awk,这会更好。
git reflog HEAD | grep 'checkout:' | head -1 | awk '{print $NF}'
很抱歉,这是另一个命令行答案,但当我发现这个问题时,我正在寻找这个答案,其中许多答案都很有用。我的解决方案是以下bashshell函数:
get_branch () {
git rev-parse --abbrev-ref HEAD | grep -v HEAD || \
git describe --exact-match HEAD 2> /dev/null || \
git rev-parse HEAD
}
这应该总是给我一些既可读又可直接用作git checkout参数的东西。
在本地分支上:feature/HS-0001在标记的提交(分离)上:v3.29.5在远程分支上(已分离,未标记):SHA1在任何其他分离的提交上:SHA1
git branch -l
这将列出所有本地分支机构,当前分支机构以绿色标记并打印
如果在分支上,则仅显示当前分支的名称,但如果分离,则打印当前提交id:
git symbolic-ref --short HEAD 2>/dev/null || git rev-parse --short HEAD
如果分离,第一部分将返回错误,第二部分将始终打印当前提交id。
使用早期的想法;假设sha1为40个字符;和跟踪引用(是的,应该删除调试打印行:-):
git reflog | awk '
$3 == "checkout:" && (sha == "" || sha == $1 ) {
from=$(NF - 2)
to=$NF
print from, to, length(from) > "/dev/stderr"
if (length(from) != 40) { print from ; exit; }
sha=substr(from, 1, 7)
print sha > "/dev/stderr"
}
'
给出原始输出:
$ git status
HEAD detached at 147049c
[...]
$ ./gime-branch.sh
a47be8d2167641088b66bf8f5c2bf7d3da0c642c HEAD^ 40
a47be8d
master HEAD^ 6
master
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的git添加?
- Rubymine:如何让Git忽略Rubymine创建的.idea文件
- Gitignore二进制文件,没有扩展名
- Git隐藏错误:Git隐藏弹出并最终与合并冲突
- 了解Git和GitHub的基础知识
- 没有。Git目录的Git克隆
- 在GitHub上有一个公共回购的私人分支?
- Git与Mercurial仓库的互操作性
- 忽略git中修改(但未提交)的文件?
- “git restore”命令是什么?“git restore”和“git reset”之间有什么区别?
- Git合并与强制覆盖
- Git拉另一个分支
- 在Bash命令提示符上添加git分支
- 如何更改Git日志日期格式