如何在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答案的简短版本,无需标签支持。