如何获取Git中当前分支的名称?
git branch
应显示回购协议的所有本地分支机构。星形分支是您当前的分支。
要仅检索您所在分支的名称,请执行以下操作:
git rev-parse --abbrev-ref HEAD
或Git 2.22及以上版本:
git branch --show-current
您只需在Linux上的存储库目录中键入命令行(控制台):
$ git status
您将看到一些文本,其中类似于:
...
On branch master
...
这意味着您当前处于主分支。如果此时您正在编辑任何文件,并且该文件位于同一本地存储库(包含受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描述。。。以人类可读的形式编写当前提交。
我希望这有帮助。
#!/bin/bash
function git.branch {
br=`git branch | grep "*"`
echo ${br/* /}
}
git.branch
很简单,我用一行(bash)就搞定了
git branch | sed -n '/\* /s///p'
(信贷:有限补偿)
当我在那里的时候,唯一的一条线路就是远程跟踪分支(如果有的话)
git rev-parse --symbolic-full-name --abbrev-ref @{u}
您还有显示完整refspec的git符号ref HEAD。
要在Git v1.8及更高版本中仅显示分支名称(感谢Greg指出这一点):
git symbolic-ref --short HEAD
在Git v1.7+上,您还可以执行以下操作:
git rev-parse --abbrev-ref HEAD
如果您在一个分支上,这两个分支都应该给出相同的分支名称。如果你头脑冷静,答案就不同了。
注:在早期的客户端上,这似乎有效:git符号ref HEAD|sed-e“s/^refs\/heads\///”–Darien 26。2014年3月
在Netbeans中,确保启用了版本控制注释(查看->显示版本控制标签)。然后,您可以看到项目名称旁边的分支名称。
http://netbeans.org/bugzilla/show_bug.cgi?id=213582
这个呢?
{ git symbolic-ref HEAD 2> /dev/null || git rev-parse --short HEAD 2> /dev/null } | sed "s#refs/heads/##"
git branch | grep "*" | sed "s/* //" | awk '{printf $0}' | pbcopy
将结果直接复制到粘贴板。感谢@olivier refalo的开始…
git symbolic-ref -q --short HEAD
我在需要当前分支名称的脚本中使用这个。它将向您显示当前HEAD的简短符号引用,这将是您当前的分支名称。
为了我自己的参考(但可能对其他人有用),我概述了本线程中提到的大多数(基本命令行)技术,每个技术都应用于几个用例:HEAD是(指向):
本地分支(主分支)远程跟踪分支,与本地分支同步(源/主与主提交相同)远程跟踪分支,与本地分支不同步(原点/功能foo)标签(v1.2.3)子模块(在子模块目录中运行)一般分离头(以上均不适用)
结果:
git分支|sed-n'/\*/s///p'本地分支:主远程跟踪分支(同步):(与源/主分离)远程跟踪分支(不同步):(与原始/功能foo分离)标签:(与v1.2.3分离)子模块:(头部在285f294处分离)通用分离头:(与285f294分离)git状态|头-1本地分支:#在分支主机上远程跟踪分支(同步):#HEAD在源站/主站分离远程跟踪分支(不同步):#HEAD在origin/feature foo分离tag:#HEAD在v1.2.3中分离子模块:#HEAD在285f294处分离一般分离封头:#在285f294处分离封头git-descripte--全部本地分支:主管/主管远程跟踪分支(同步):头/主(注意:不是远程/原点/主)远程跟踪分支(不同步):remotes/origin/feature foo标签:v1.2.3子模块:remotes/origin/HEAD通用分离头:v1.0.6-5-g2393761cat.git/HEAD:本地分支:ref:refs/heads/master子模块:cat:.git/HEAD:不是目录所有其他用例:相应提交的SHAgit-rev-parse--缩写ref HEAD本地分支:主所有其他用例:HEADgit符号ref—短HEAD本地分支:主所有其他用例:fatal:ref HEAD不是符号ref
(仅供参考,这是使用git 1.8.3.1版完成的)
找到了一个与Oliver Refalo相同长度的命令行解决方案,使用了良好的ol‘awk:
git branch | awk '/^\*/{print $2}'
awk将其理解为“在与正则表达式匹配的行上执行{}中的内容”。默认情况下,它采用空格分隔的字段,因此您可以打印第二个。如果假设只有分支所在的行具有*,则可以删除^。啊,打高尔夫!
如果在Jenkins中运行,可以使用GIT_BRANCH变量,如下所示:https://wiki.jenkins-ci.org/display/JENKINS/Git+插件
git插件设置了几个可以在脚本中使用的环境变量:
GIT_COMMIT-当前的SHAGIT_BRANCH—当前使用的分支的名称,例如“master”或“origin/foo”GIT_PREVIOUS_COMMIT-来自同一个的上一个生成提交的SHA分支(第一个内置分支上的当前SHA)GIT_URL-存储库远程URLGIT_URL_N-存储库远程URL(当超过1个时)遥控器,例如GIT_URL_1、GIT_URL_2GIT_AUTHOR_EMAIL-提交人/作者电子邮件GIT_COMMITTER_EMAIL-提交人/作者电子邮件
随着时间的推移,我们可能会有一长串分支。
虽然其他一些解决方案很好,但以下是我所做的(从雅各布的回答中简化):
git branch | grep \*
Now,
git status
有效,但仅当有任何本地更改时
如果您确实希望最后一个分支/标记也在分离的HEAD状态下检出。
git reflog HEAD | grep 'checkout:' | head -1 | rev | cut -d' ' -f1 | rev
使现代化如果你有而且不害怕awk,这会更好。
git reflog HEAD | grep 'checkout:' | head -1 | awk '{print $NF}'
我知道这很晚了,但在linux/mac上,从终端可以使用以下命令。
git status | sed -n 1p
说明:
gitstatus->获取工作树状态sed-n 1p->从状态体获取第一行
对上述命令的响应如下:
"On branch your_branch_name"
很抱歉,这是另一个命令行答案,但当我发现这个问题时,我正在寻找这个答案,其中许多答案都很有用。我的解决方案是以下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
我有一个名为gitcbr(当前分支)的简单脚本,它打印出当前分支的名称。
#!/bin/bash
git branch | grep -e "^*"
我将此脚本放在一个自定义文件夹(~/.bin)中。该文件夹位于$PATH中。
所以现在,当我在git repo中时,我只需键入git cbr即可打印出当前的分行名称。
$ git cbr
* master
这是因为git命令接受其第一个参数,并尝试运行名为git-arg1的脚本。例如,gitbranch尝试运行名为gitbranch等的脚本。
使用早期的想法;假设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
您可以永久设置bash输出以显示git分支名称。当您使用不同的分支时,它非常方便,无需一直键入$git状态。Github repo git-aware提示.
打开终端(ctrl-alt-t)并输入命令
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\]\$ "
在前面粘贴安装代码的同一文件的末尾。这将为您提供彩色输出:
使用Mac将其添加到PS1:
PS1='\W@\u >`[ -d .git ] && git branch | grep ^*|cut -d" " -f2`> $ '
在运行上述命令之前:
运行该命令后:
不要担心,如果它不是GIT存储库,它不会显示错误,因为[-d.GIT]会检查.GIT文件夹是否存在。
下面的shell命令告诉您当前所在的分支。
git branch | grep ^\*
如果您不想在每次想知道分支并使用Bash时键入长命令,请为该命令提供一个短别名,例如别名cb,如下所示。
alias cb='git branch | grep ^\*'
当您在branch master中并且提示为$时,您将获得*master,如下所示。
$ cb
* master
可以在工作目录中使用gitbash命令如下
git status -b
它会告诉你你在哪个分支机构有许多有用的命令
-s
--短路,短路以短格式输出。
-b级--分支,分支以短格式显示分支和跟踪信息。
--瓷器[=]为脚本提供易于解析的输出格式。这与短输出类似,但无论用户配置如何,在Git版本中都会保持稳定。详见下文。
version参数用于指定格式版本。这是可选的,默认为原始版本v1格式。
--长的,长的以长格式给出输出。这是默认设置。
-五--冗长的,冗长的除了已更改的文件名之外,还显示要提交的文本更改(例如,像gitdiff-cached的输出)。如果两次指定了-v,那么还将显示工作树中尚未暂存的更改(例如,像gitdiff的输出)。
在分离头上返回分支名称或SHA1:
git rev-parse --abbrev-ref HEAD | grep -v ^HEAD$ || git rev-parse HEAD
这是@dmaestro12答案的简短版本,没有标记支持。
只需在~/.bash_profile中添加以下行:
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\] $ "
这样,您可以在Terminal中拥有当前分支名称
由Coderwall.com提供
git status
还将给出分支名称以及更改。
e.g.
>git status
On branch master // <-- branch name here
.....
我建议使用这两个命令中的任何一个。
git分支|grep-e“^*”|cut-d“”-f 2
OR
gitstatus | sed-n 1p | cut-d“”-f 3
OR(更详细)
gitstatus-uno-bs|cut-d“#”-f 3 | cut-d-f 1'|sed-e's/^[\t]//1'|sed-n 1p
gitbranch仅显示当前分支名称。
虽然gitbranch将显示所有分支并用星号突出显示当前分支,但在处理大量分支时,它可能太麻烦。
要仅显示当前所在的分支,请使用:
git rev-parse --abbrev-ref HEAD
我知道这已经得到了回答,但在最新版本的Git中,命令gitbranch会以某种提示打开分支列表,您必须退出。这让我烦死了!
这是我的解决方案:打开bash配置文件并键入:
#!/bin/bash
git() {
if [[ $@ == "branch" ]] then
command git branch -a | grep -v 'remotes'
else
command git "$@"
fi
}
现在打开终端,在git repo中键入以下命令进行测试:
source ~/.zshrc
git branch
瞧!您的本地分支机构列表将在您的终端中打印出来。
编写到bashrc文件的代码将覆盖gitbranch的默认函数,并用一个更长的命令替换它,该命令通过-a参数列出所有本地分支。然后我们把多余的不需要的业务打印出来。如果排除grep命令,仍然会得到令人讨厌的提示。如果您不熟悉编写bash命令,请检查以下解释:关于.bash_profile、.bashrc,以及别名应该写在哪里?
您可以使用一条grep指令来完成此操作,使用Perl模式和\K来重置匹配缓冲区,因此您只能获得分支名称。
$ git branch | grep -oP "^\*\s+\K\S+$"
master
从git的2.22版本开始,您可以使用:
git branch --show-current
根据手册页:
打印当前分支的名称。在分离HEAD状态下,不打印任何内容。
您还可以在当前项目的.git目录中看到当前分支的名称。
在终端中键入命令:open.git/HEAD输出文件包含当前分支的名称ref:refs/heads/{current_working_branch}
我会尝试以下方法之一:
1.>git符号ref--短HEAD
git symbolic-ref --short HEAD
>>> sid-dev
2.>git分支--显示当前
git branch --show-current
>>> sid-dev
3.>git name rev–仅名称HEAD
git name-rev –name-only HEAD
>>> HEAD sid-dev
笔记:
1.>git symbol ref--short HEAD显示当前分支HEAD的简短符号引用。这是当前分支名称。
2.>gitbranch--showcurrent也是打印当前分支名称的一种简单有效的方法。
3.>git name rev–name only HEAD为当前分支的HEAD版本提供符号名称
4.>在上面的示例中,sid-dev是我的分支的名称。
我一直在与CircleCI和git标签斗争,这就是我最终的结果:
if [[ -n $(git branch --show-current) ]]; then
git branch --show-current
else
git branch -a --contains $(git rev-parse --short HEAD) \
| sed '/HEAD/d' \
| sed 's/remotes\/origin\///g' \
| sed 's/\*//g' | sed 's/ *//g' \
| awk '!_[$0]++'
fi
虽然有点难看,但确实如此
常规提交的工作:它只使用git的--show current标志,如果有效,我们就不需要再多看了;本地和CI容器上标记的工作:当头部分离时,它将获得远程分支名称。
注意事项:
只要标记的提交只出现在一个分支上,这就可以正常工作。因此,如果您通常合并到dev,并从那里通过转移到生产,那么来自dev的原始提交将出现在所有三个分支上,从而破坏代码。但只要您只标记合并/PR提交这需要预先运行git fetch-a,因为CI只会检出默认的分支和标记的提交,所以如果正确的分支都不是,它将无法工作
更多解释:
我想获得分支名称,即使CI构建是由标记触发的。在这种情况下,没有设置CircleCI pipeline.git.branch变量,也无法在头部分离时从git中轻松获取分支名称(正如许多其他问题中所指出的)。这意味着grepping当前分支(使用*前缀)也不能像在CI上那样工作,当前分支将是分离的头部分支。其想法是获取包含此提交的所有分支(包括远程分支);然后删除分离的head结果,去掉所有不是实际分支名称的位并消除重复
一个简单的黑客可以
git branch|grep "*"
输出:
* <current branch>
编辑:
了解当前分支的另一种方法
git status|head -1
On branch <current branch name>
在终端中写入以下命令:
git branch | grep \*
or
git branch --show-current
或Git 2.22及以上版本:
git branch --show
如果在分支上,则仅显示当前分支的名称,但如果分离,则打印当前提交id:
git symbolic-ref --short HEAD 2>/dev/null || git rev-parse --short HEAD
如果分离,第一部分将返回错误,第二部分将始终打印当前提交id。
推荐文章
- 在多个阶段条目的git中出现致命错误
- Git合并错误“提交不可能,因为你有未合并的文件”
- Git推送错误:拒绝更新签出的分支
- 撤销一个合并拉请求?
- Git -dir没有正常工作
- 密码身份验证暂时被禁用,作为停电的一部分。请改用个人访问令牌
- 如何使Sublime Text成为Git的默认编辑器?
- 我怎么能在' git日志'中显示分支的名称?
- Subversion中的主干、分支和标签是什么?
- 用新的.gitignore文件重新同步git repo
- 如何正确地关闭一个功能分支在Mercurial?
- 如何预览git-pull?
- 如何删除git历史记录中的特定修订?
- 如何获得Git存储库中的Git存储库名称?
- 当git说它正在“解析delta”时,它实际上在做什么?