How to get the current branch name in Git?
我来自一个颠覆性的背景,当我有一个分支的时候,我知道我正在处理的是"这些工作文件指向这个分支"。
但是对于git,我不确定什么时候用netbeans或notepad++,编辑一个文件,不管它是绑定到master还是其他分支。
巴什的
要显示当前所在的分支,而不显示列出的其他分支,可以执行以下操作:
1 | git rev-parse --abbrev-ref HEAD |
。
参考文献:
- 仅以Git显示当前分支(2009年9月)
1 | git branch |
应显示回购的所有本地分支机构。星型分支是您当前的分支。
如果只想检索所属分支的名称,可以执行以下操作:
1 | git branch | grep \* | cut -d ' ' -f2 |
号
您还拥有显示完整refspec的
只显示Git v1.8及更高版本中的分支名称(感谢Greg指出这一点):
1 | $ git symbolic-ref --short HEAD |
。
在Git v1.7+上,您还可以执行以下操作:
1 | $ git rev-parse --abbrev-ref HEAD |
如果您在一个分支上,两个分支都应该给出相同的分支名称。如果你是一个超然的人,答案是不同的。
Note:
On an earlier client, this seems to work:
1 $ git symbolic-ref HEAD | sed -e"s/^refs\/heads\///"– Darien 26. Mar 2014
号
为了我自己的参考(但它可能对其他人有用),我概述了这个线程中提到的大多数(基本命令行)技术,每个技术都应用于几个用例:head(指向):
- 本地分行(主)
- 远程跟踪分支,与本地分支同步(源站/主服务器与主服务器处于同一提交状态)
- 远程跟踪分支,与本地分支不同步(源站/功能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) 。 - 子模块:
(HEAD detached at 285f294) 。 - 总分离头:
(detached from 285f294) 。
- 当地分支机构:
- 江户十一〔七〕号
- 当地分支机构:
# On branch master 。 - 远程跟踪分支(同步):
# HEAD detached at origin/master 。 - 远程跟踪分支(不同步):
# HEAD detached at origin/feature-foo 。 - 标签:
# HEAD detached at v1.2.3 。 - 子模块:
# HEAD detached at 285f294 。 - 总分离头:
# HEAD detached at 285f294 。
- 当地分支机构:
- 埃多克斯1〔14〕
- 当地分支机构:
heads/master 。 - 远程跟踪分支(同步):
heads/master (注:非remotes/origin/master ) - 远程跟踪分支(不同步):
remotes/origin/feature-foo 。 - 标签:
v1.2.3 。 - 子模块:
remotes/origin/HEAD 。 - 总分离头:
v1.0.6-5-g2393761 。
- 当地分支机构:
cat .git/HEAD 号:- 当地分支机构:
ref: refs/heads/master 。 - 子模块:
cat: .git/HEAD: Not a directory 。 - 所有其他用例:对应提交的sha
- 当地分支机构:
- 埃多克斯1〔25〕
- 当地分支机构:
master 。 - 所有其他用例:
HEAD 。
- 当地分支机构:
- 埃多克斯1〔28〕
- 当地分支机构:
master 。 - 所有其他用例:
fatal: ref HEAD is not a symbolic ref 。
- 当地分支机构:
(仅供参考,这是用git版本1.8.3.1完成的)
另一个选择:
1 | git name-rev --name-only HEAD |
很简单,我把它放在一行(bash)里。
1 | git branch | sed -n '/\* /s///p' |
。
(信用证:有限赔偿)
当我在那里的时候,一条线路去远程跟踪分支(如果有的话)
1 | git rev-parse --symbolic-full-name --abbrev-ref @{u} |
您只需在Linux上的存储库目录中键入命令行(console):
1 | $ git status |
您将看到一些文本,其中类似于:
1 2 3 | ... On branch master ... |
。
这意味着你现在在
1 | git symbolic-ref -q --short HEAD |
号
我在需要当前分支名称的脚本中使用它。它将显示当前对head的简短符号引用,即当前分支名称。
1 | git branch | grep -e"^*" | cut -d' ' -f 2 |
只显示分支名称
虽然Git分支会显示所有分支并用星号突出显示当前的分支,但是在处理大量分支时,它可能太麻烦了。
要仅显示当前所在的分支,请使用:
1 | git rev-parse --abbrev-ref HEAD |
找到了与Oliver Refalo相同长度的命令行解决方案,使用good ol'awk:
1 | git branch | awk '/^\*/{print $2}' |
1 2 3 4 5 6 | #!/bin/bash function git.branch { br=`git branch | grep"*"` echo ${br/* /} } git.branch |
。
为什么不使用git-aware shell提示,它会告诉您当前分支的名称?
来自
首先,如果检测到正在进行的重新平衡,则会出现特殊情况。Git在REBASE过程中使用未命名的分支(分离的头)使其成为原子分支,而原始分支保存在其他地方。
如果
否则,它读取
如果此文件不存在,则没有当前分支。如果存储库是空的,通常会发生这种情况。
如果它以
'ref: ' 前缀开头,那么.git/HEAD 是symref(符号引用),我们处于正常分支。去掉这个前缀得到全名,去掉refs/heads/ 得到当前分支的简称:1
2
3b="${head#ref: }"
# ...
b=${b##refs/heads/}如果它不是从
'ref: ' 开始,那么它是分离的head(匿名分支),直接指向某个commit。使用git describe ... 以人类可读的形式编写当前提交。
希望有帮助。
抱歉,这是另一个命令行答案,但当我发现这个问题时,我正在寻找这个答案,其中许多答案都很有用。我的解决方案是以下bash shell函数:
1 2 3 4 5 | get_branch () { git rev-parse --abbrev-ref HEAD | grep -v HEAD || \ git describe --exact-match HEAD 2> /dev/null || \ git rev-parse HEAD } |
。
这应该总是给我一些既人类可读又可以直接用作
- 当地分支机构:
feature/HS-0001 。 - 有标记的提交(分离):
v3.29.5 。 - 在远程分支上(分离,未标记):sha1
- 任何其他独立承诺:sha1
您可以在工作目录上使用git bash命令如下
1 | git status -b |
号
它会告诉你你在哪家分店有许多有用的命令,其中一些是
1 | -s |
号
--短以短格式给出输出。
-B--分支以短格式显示分支和跟踪信息。
--瓷[=]为脚本提供易于解析的输出格式。这类似于短输出,但在Git版本中保持稳定,无论用户配置如何。详情见下文。
version参数用于指定格式版本。这是可选的,默认为原始版本v1格式。
--长以长格式给出输出。这是默认设置。
-V--详细除了已更改的文件名之外,还显示要提交的阶段性文本更改(如git diff的输出缓存)。如果指定了-v两次,那么还将显示工作树中尚未进行阶段化的更改(如git diff的输出)。
一个低噪音版本的Git状态可以做到这一点。
1 | git status -bsuno |
号
它打印出来
1 | ## branch-name |
号
我建议使用这两个命令中的任何一个。
埃多克斯1〔17〕
或
埃多克斯1〔18〕
或(更详细)
埃多克斯1〔19〕
随着时间的推移,我们可能会有一个非常长的分支列表。
虽然其他一些解决方案都很好,但下面是我的工作(从雅各布的回答中简化):
1 | git branch | grep \* |
号
现在,
1 | git status |
有效,但仅在有任何本地更改时有效
在NetBeans中,确保启用了版本控制注释(视图->显示版本控制标签)。然后可以看到项目名称旁边的分支名称。
http://netbeans.org/bugzilla/show_bug.cgi?内径=213582
从2.22版的Git开始,您只需使用:
1 | git branch --show-current |
。
这个怎么样?
1 | { git symbolic-ref HEAD 2> /dev/null || git rev-parse --short HEAD 2> /dev/null } | sed"s#refs/heads/##" |
号
我有一个名为
1 2 3 | #!/bin/bash git branch | grep -e"^*" |
我把这个脚本放在一个自定义文件夹(
所以现在我在Git回购中,只需输入
1 2 | $ git cbr * master |
号
这是因为
下面的shell命令告诉您当前所在的分支。
1 | git branch | grep ^\* |
当您不想在每次想要了解分支和使用bash时都输入长命令时,请给该命令一个简短的别名,例如alias
1 | alias cb='git branch | grep ^\*' |
。
当您在分支主系统中,提示为
1 2 | $ cb * master |
号
您可以永久设置bash输出以显示Git分支名称。使用不同的分支时非常方便,不需要一直输入
打开终端(ctrl-alt-t)并输入命令
1 2 3 | mkdir ~/.bash cd ~/.bash git clone git://github.com/jimeh/git-aware-prompt.git |
。
用
1 2 | export GITAWAREPROMPT=~/.bash/git-aware-prompt source"${GITAWAREPROMPT}/main.sh" |
。
然后粘贴代码
1 | 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\]\$" |
在同一个文件的末尾,您将安装代码粘贴到了前面的文件中。这将为您提供彩色输出:。
1 | git status |
号
还将提供分支名称和更改。
例如
1 2 3 | >git status On branch master // <-- branch name here ..... |
号
如果您真的希望最后一个分支/标记也以分离的头部状态签出。
1 | git reflog HEAD | grep 'checkout:' | head -1 | rev | cut -d' ' -f1 | rev |
。
更新这是更好的,如果你有和不害怕awk。
1 | git reflog HEAD | grep 'checkout:' | head -1 | awk '{print $NF}' |
在分离的头上返回分支名称或sha1:
1 | git rev-parse --abbrev-ref HEAD | grep -v ^HEAD$ || git rev-parse HEAD |
号
这是@dmaestro12答案的简短版本,没有标签支持。
我知道这很晚了,但是在Linux/Mac上,从终端上可以使用以下内容。
1 | git status | sed -n 1p |
。
说明:
git status->获取工作树状态sed-n 1p->从状态体获取第一行
对上述命令的响应如下:
1 | "On branch your_branch_name" |
。
您还可以使用git_分支变量,如下所示:https://wiki.jenkins-ci.org/display/jenkins/git+插件
Git插件设置了几个可以在脚本中使用的环境变量:
Git_commit-当前的sha
Git_Branch-当前使用的分支的名称,例如"master"或"origin/foo"
git_previous_commit-来自同一分支的上一个已生成commit的sha(第一个内置分支上的当前sha)
Git_URL-存储库远程URL
Git_url_n-当远程数超过1个时,存储库远程URL,例如Git_url_1、Git_url_2
Git_作者电子邮件-提交人/作者电子邮件
Git提交人电子邮件-提交人/作者电子邮件
使用mac将其添加到
1 | PS1='\W@\u >`[ -d .git ] && git branch | grep ^*|cut -d"" -f2`> $ ' |
。
在运行上述命令之前:
氧化镁
运行该命令后:
氧化镁
不用担心,如果不是Git存储库,它不会显示错误,因为
1 | git branch | grep"*" | sed"s/* //" | awk '{printf $0}' | pbcopy |
号
将结果直接复制到粘贴板。感谢@olivier refalo的首发…
使用之前的想法;假设sha1是40个字符;并跟踪引用(是的,应该删除调试打印行:-):
1 2 3 4 5 6 7 8 9 10 | 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" } ' |
。
给出原始输出:
1 2 3 4 5 6 7 8 | $ git status HEAD detached at 147049c [...] $ ./gime-branch.sh a47be8d2167641088b66bf8f5c2bf7d3da0c642c HEAD^ 40 a47be8d master HEAD^ 6 master |
使用
简单地说,在您的
1 2 3 4 | branch_show() { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' } export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(branch_show)\[\033[00m\] $" |
号
这样,您就可以在终端中使用当前的分支名称。
由coderwall.com提供
我知道这个问题已经得到了解决,但是在最新版本的git中,命令
我的解决方法是:打开您的bash配置文件并在以下位置键入:
1 2 3 4 5 6 7 8 | #!/bin/bash git() { if [[ $@ =="branch" ]] then command git branch -a | grep -v 'remotes' else command git"$@" fi } |
号
现在打开终端并通过在git repo中键入以下命令进行测试:
1 2 | source ~/.zshrc git branch |
瞧!您的本地分支的列表将在终端中打印出来。
您正在写入bashrc文件的代码覆盖了
仅获取本地分支名称:
1 | git status -b -u no | awk 'NR==1{print $3;}' |
。
仅获取远程分支名称:
1 | git status -b -u no | awk 'NR==2{print $6;}' |
和
您可以用一条grep指令来完成这项工作,使用perl模式和
1 2 | $ git branch | grep -oP"^\*\s+\K\S+$" master |
。