如何在Git中获取当前分支名称?
我来自Subversion的背景,当我有一个分支时,我知道我正在处理“这些工作文件指向这个分支”。
但是对于Git,我不确定当我在NetBeans或Notepad ++中编辑文件时,无论它是绑定到主或其他分支。
在bash中git没有问题,它告诉我我在做什么。 
  git branch应该显示你所有的回购当地分支。 星号分支是您当前的分支。 
 git rev-parse --abbrev-ref HEAD 
这将显示当前分支。
参考:
- 仅显示Git中的当前分支(2009年9月)
 你也有git symbolic-ref HEAD ,它显示完整的refspec。 
要在Git v1.8及更高版本中只显示分支名称(感谢Greg指出了这一点):
 $ git symbolic-ref --short HEAD 
在Git v1.7 +上,你也可以:
 $ git rev-parse --abbrev-ref HEAD 
如果你在一个分支上,两者应该给出相同的分支名称。 如果你在一个孤独的头上答案不同。
注意:
在较早的客户端,这似乎工作:
$ git symbolic-ref HEAD | sed -e "s/^refs\/heads\///"– Darien 26. Mar 2014
对于我自己的引用(但对其他人可能有用),我概述了本主题中提到的大多数(基本命令行)技术,每种技术都应用于几个用例:HEAD(指向):
- 本地分行(主)
- 远程跟踪分支,与本地分支同步(起源/主控与主控相同)
- 远程跟踪分支,不与本地分支同步(origin / feature-foo)
- 标签(v1.2.3)
- 一般脱离头(以上都不是)
结果:
-  git branch | sed -n '/\* /s///p'-  本地分支: master
-  远程跟踪分支(同步):( (detached from origin/master)
-  远程跟踪分支(不同步):( (detached from origin/feature-foo)
-  标签:( (detached from v1.2.3)
-  将军脱离头:( (detached from 285f294)
 
-  本地分支: 
-  git status | head -1-  本地分支: # On branch master
-  远程跟踪分支(同步): # HEAD detached at origin/master
-  远程跟踪分支(不同步): # HEAD detached at origin/feature-foo
-  标签: # HEAD detached at v1.2.3
-  一般分离的头: # HEAD detached at 285f294
 
-  本地分支: 
-  git describe --all-  当地分行: heads/master
-  远程跟踪分支(同步): heads/master(注意: 不是remotes/origin/master)
-  远程追踪分支(不同步): remotes/origin/feature-foo
-  标签: v1.2.3
-  一般分离头: v1.0.6-5-g2393761
 
-  当地分行: 
-   cat .git/HEAD:-  本地分支: ref: refs/heads/master
- 所有其他用例:相应提交的SHA
 
-  本地分支: 
-  git rev-parse --abbrev-ref HEAD-  本地分支: master
-  所有其他用例: HEAD
 
-  本地分支: 
-  git symbolic-ref --short HEAD-  本地分支: master
-  所有其他用例: fatal: ref HEAD is not a symbolic ref
 
-  本地分支: 
(FYI这是用git 1.8.3.1版本完成的)
另一个select:
 git name-rev --name-only HEAD 
很简单,我在一个class轮(bash)
 git branch | sed -n '/\* /s///p' 
(信贷:有限赎罪)
当我在那里的时候,一个class轮去远程跟踪分支(如果有的话)
 git rev-parse --symbolic-full-name --abbrev-ref @{u} 
您只需在Linux目录中input命令行(控制台)即可:
 $ git status 
你会看到一些文字,其中有些类似于:
 ... On branch master ... 
 这意味着您目前在master分支上。 如果此时正在编辑任何文件,并且它位于同一本地存储库(包含Git版本控制pipe理下的文件的本地目录),则您正在编辑该分支中的文件。 
 git symbolic-ref -q --short HEAD 
我在需要当前分支名称的脚本中使用它。 它会告诉你当前HEAD的短符号引用,这将是你当前的分支名称。
 git branch | grep -e "^*" | cut -d' ' -f 2 
将只显示分支名称
find一个和Oliver Refalo一样长的命令行解决scheme,使用好的awk:
 git branch | awk '/^\*/{print $2}' 
  awk认为这是“在匹配正则expression式的行上执行的内容”。 默认情况下,它假定用空格分隔的字段,所以你打印第二个。 如果你可以假设只有你的分支的行有*,你可以删除^。 啊,打高尔夫! 
你可以在工作目录下使用git bash命令如下
 git status -b 
它会告诉你你在哪个分支上有许多有用的命令,其中有些是有用的
 -s 
– short以短格式输出。
-b –branch以短格式显示分支和跟踪信息。
–porcelain [=]为脚本提供易于parsing格式的输出。 这与短输出类似,但在Git版本中保持稳定,而且不pipe用户configuration如何。 详情请参阅下文。
版本参数用于指定格式版本。 这是可选的,默认为原始版本v1格式。
– long以长格式输出。 这是默认的。
-v –verbose除了已经更改的文件的名称之外,还显示了正在执行的文本更改(即,像git diff –cached的输出一样)。 如果指定了-v两次,那么也显示工作树中尚未分阶段的更改(即与git diff的输出一样)。
 #!/bin/bash function git.branch { br=`git branch | grep "*"` echo ${br/* /} } git.branch 
在Netbeans中,确保已启用版本控制注释(查看 – >显示版本控制标签)。 您可以看到项目名称旁边的分支名称。
随着时间的推移,我们可能会有一个非常长的分支名单。
虽然其他一些解决scheme是伟大的,这是我所做的(从雅各布的答案简化):
 git branch | grep \* 
现在,
 git status 
作品,但只有当有任何地方的变化
 为什么不使用git-aware shell提示符,它会告诉你当前分支的名称?  git status也有帮助。 
 如何从contrib/ git(git版本2.3.0) __git_ps1 ,在__git_ps1辅助函数中定义: 
- 
首先,如果检测到正在进行重新分配 ,则有特殊情况。 Git在rebase过程中使用未命名的分支(分离的HEAD)使其成为primefaces,并将原始分支保存在别处。 
- 
如果 .git/HEAD文件是一个符号链接(从Git的古老历史中,这是一个非常罕见的情况),它使用git symbolic-ref HEAD 2>/dev/null
- 
否则,它读取 .git/HEAD文件。 后续步骤取决于其内容:- 
如果这个文件不存在,那么就没有当前的分支。 这通常发生,如果存储库是裸露的。 
- 
如果以 'ref: '前缀开始,那么.git/HEAD是symref(符号引用),而我们是在正常的分支上。 去掉这个前缀得到全名,并且去掉refs/heads/来得到当前分支的简称:b="${head#ref: }" # ... b=${b##refs/heads/}
- 
如果它不以 'ref: ',那么它是分离的HEAD(匿名分支),直接指向一些提交。 使用git describe ...以可读的forms写入当前提交。
 
- 
我希望有帮助。
以下shell命令会告诉您当前所在的分支。
 git branch | grep ^\* 
 当你不想在每一次你想知道分支的时候input那么长的命令,并且你正在使用Bash的时候,给这个命令一个简短的别名,比如别名cb ,就像这样。 
 alias cb='git branch | grep ^\*' 
 当你在分支大师和你的提示是$ ,你会得到* master如下。 
 $ cb * master 
那这个呢?
 { git symbolic-ref HEAD 2> /dev/null || git rev-parse --short HEAD 2> /dev/null } | sed "s#refs/heads/##" 
 我有一个简单的脚本叫做git-cbr ( 当前分支 ),它打印出当前的分支名称。 
 #!/bin/bash git branch | grep -e "^*" 
 我把这个脚本放在一个自定义文件夹( ~/.bin )中。 该文件夹在$PATH 。 
 所以现在当我在一个git repo中时,只需inputgit cbr来打印出当前的分支名称即可。 
 $ git cbr * master 
 这是有效的,因为git命令接受它的第一个参数,并试图运行一个脚本,它的名字是git-arg1 。 例如, git branch试图运行一个叫做git-branch的脚本等等。 
对不起,这是另一个命令行答案,但这就是我发现这个问题时,我正在寻找,许多这些答案是有帮助的。 我的解决scheme是以下bash shell函数:
 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
 你可以永久设置你的bash输出来显示你的git-branch名字。 当你使用不同的分支时非常方便,不需要一直input$ git status 。  Github回购git-aware-prompt 。 
打开你的terminal(ctrl-alt-t)并input命令
 mkdir ~/.bash cd ~/.bash git clone git://github.com/jimeh/git-aware-prompt.git 
 用sudo nano ~/.bashrc命令编辑你的.bashrc(用于Ubuntu),并在顶部添加以下内容: 
 export GITAWAREPROMPT=~/.bash/git-aware-prompt source "${GITAWAREPROMPT}/main.sh" 
然后粘贴代码
 export PS1="\${debian_chroot:+(\$debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\] \[$txtcyn\]\$git_branch\[$txtred\]\$git_dirty\[$txtrst\]\$ " 
 在同一个文件的末尾,您将安装代码粘贴到更早的版本中。 这会给你彩色的输出:  
 
如果你真的想要在分离的HEAD状态中检出最后的分支/标签。
 git reflog HEAD | grep 'checkout:' | head -1 | rev | cut -d' ' -f1 | rev 
更新这是更好,如果你有,并不害怕awk。
 git reflog HEAD | grep 'checkout:' | head -1 | awk '{print $NF}' 
 使用Mac将其添加到PS1 : 
 PS1='\W@\u >`[ -d .git ] && git branch | grep ^*|cut -d" " -f2`> $ ' 
在运行上面的命令之前:
  
 
运行该命令之后:
  
 
 不要担心,如果它不是GIT仓库,它将不会显示错误,因为[-d .git]检查.git文件夹是否存在。 
您也可以使用GIT_BRANCHvariables,如下所示: https ://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin
git插件设置了几个可以在脚本中使用的环境variables:
GIT_COMMIT – 当前的SHA
GIT_BRANCH – 当前正在使用的分支的名称,例如“master”或“origin / foo”
GIT_PREVIOUS_COMMIT – 来自同一分支的先前构build提交的SHA(分支中第一次构build的当前SHA)
GIT_URL – 存储库远程URL
GIT_URL_N – 存在多个遥控器时的存储库远程URL,例如GIT_URL_1,GIT_URL_2
GIT_AUTHOR_EMAIL – 提交者/作者电子邮件
GIT_COMMITTER_EMAIL – 提交者/作者电子邮件
我知道这是晚了,但在Linux / MAC,从terminal,你可以使用以下。
 git status | sed -n 1p 
说明:
  git status  – >获取工作树状态 
  sed -n 1p  – >从状态体获取第一行 
对上述命令的响应如下所示:
 "On branch your_branch_name" 
使用较早的想法; 假设sha1是40个字符; 和追逐引用(是的,应该删除debugging打印行:-):
 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 branch | grep "*" | sed "s/* //" | awk '{printf $0}' | pbcopy 
直接将结果复制到粘贴板。 感谢@ olivier-refalo的开始…
分离头时,返回分支名称或SHA1:
 git rev-parse --abbrev-ref HEAD | grep -v ^HEAD$ || git rev-parse HEAD 
这是@ dmaestro12答案的简短版本,无需标签支持。