如何在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中,确保已启用版本控制注释(查看 – >显示版本控制标签)。 您可以看到项目名称旁边的分支名称。

http://netbeans.org/bugzilla/show_bug.cgi?id=213582

随着时间的推移,我们可能会有一个非常长的分支名单。

虽然其他一些解决scheme是伟大的,这是我所做的(从雅各布的答案简化):

 git branch | grep \* 

现在,

 git status 

作品,但只有当有任何地方的变化

为什么不使用git-aware shell提示符,它会告诉你当前分支的名称? git status也有帮助。


如何从contrib/ git(git版本2.3.0) __git_ps1 ,在__git_ps1辅助函数中定义:

  1. 首先,如果检测到正在进行重新分配 ,则有特殊情况。 Git在rebase过程中使用未命名的分支(分离的HEAD)使其成为primefaces,并将原始分支保存在别处。

  2. 如果.git/HEAD文件是一个符号链接(从Git的古老历史中,这是一个非常罕见的情况),它使用git symbolic-ref HEAD 2>/dev/null

  3. 否则,它读取.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答案的简短版本,无需标签支持。